2010-02-05 3 views
0

Я использую функцию write() для записи в сокет в C. Я не эксперт по C, и иногда я знаю, что эта функция может потерпеть неудачу, в таких случаях она может вернуть какой-то SIGPIPE.Как правильно использовать функцию write() для сокетов?

Вот простой кусок кода, я использую сейчас:

if(write(sockfd, sendline, sizeof(sendline)) < sizeof(sendline)) 
    { 
     printf("Failed to write string %s to socket" , sendline); 
     return NULL; 
    } 

Мой вопрос, как я могу правильно управлять этими видами ошибок (SIGPIPE и т.д.) при использовании этой функции?

ответ

4

Насколько «как обрабатывать ошибки», вы должны проверить возвращаемое значение write() будучи -1, а затем, если вы хотите, чтобы различать условия ошибки смотрите на значения errno.

В конкретном случае SIGPIPE это доставляется процессу, если попытка произвести запись в сокет, конец считывания которого закрыт. По умолчанию доставка SIGPIPE приведет к завершению процесса. Если вы не хотите этого поведения, вам необходимо явно игнорировать SIGPIPE (signal(SIGPIPE, SIG_IGN)), а затем звонок write() будет возвращен -1, а errno будет равен EPIPE.

+0

Спасибо за ваш ответ! , очень ясно ! – Goles

Смежные вопросы