Как правильно использовать функцию write () для сокетов? - PullRequest
0 голосов
/ 05 февраля 2010

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

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

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

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

1 Ответ

4 голосов
/ 05 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...