Проверка EINTR необходима для всей работы сокета? - PullRequest
0 голосов
/ 01 сентября 2018

Я исследовал и обнаружил, что прерывание сигнала может произойти при программировании с сокетами. Я искал и обнаружил, что в случае прерывания сигнала, мы должны повторить попытку. То есть я должен отловить ошибку и повторить попытку. Я должен создать сокет, как это.

int create_sock()
{
    int sock;

    while (1)
    {
        sock = socket(AF_INET, SOCK_STREAM, 0);

        if (sock == -1)
        {
            if (errno == EINTR)
            {
                continue;
            }
            else
            {
                perror("create_sock");
                exit(-1);
            }
        }

        break;
    }

    return sock;

}

Должен ли я следовать вышеописанной процедуре в случае функции закрытия, отправки и подключения?

1 Ответ

0 голосов
/ 01 сентября 2018

Требуется ли проверка EINTR для всей работы сокета? Да, в идеале вы должны проверить. Не только socket() существует много системных вызовов, которые сообщают EINTR ОШИБКИ, если сигнал произошел во время выполнения системного вызова.

со страницы руководства signal(7)

Прерывание системных вызовов и функций библиотеки по сигналу handlers Если обработчик сигнала вызывается во время системного вызова или вызов библиотечной функции заблокирован, либо:

   * the *call is automatically  restarted  after  the  signal
     handler returns*; or

   * the call fails with the error **EINTR**.

Если заблокирован вызов одного из следующих интерфейсов, прерванный обработчиком сигнала, , тогда вызов будет автоматически перезапускается после возвращения обработчика сигнала если использовался флаг SA_RESTART; в противном случае вызов будет ошибка с ошибкой EINTR: Интерфейсы сокетов: accept (2), connect (2), recv (2), recvfrom (2), recvmsg (2), send (2), sendto (2) и sendmsg (2), если на гнездо (см. ниже).

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