插座的所有操作是否都需要检查EINTR?

时间:2018-09-01 17:15:36

标签: c linux sockets tcp

我研究发现,使用套接字编程时可能会发生信号中断。我搜索后发现,如果信号中断,我们应该重试。也就是说,我必须捕获错误并重试。我必须创建这样的套接字。

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 :(得分:2)

是否正在检查套接字所有操作所需的EINTR?是的,理想情况下,您应该进行检查。如果进行系统调用时发生信号,不仅socket()还会报告EINTR错误的系统调用。

signal(7)的手册页中

  

通过信号中断系统调用和库功能          处理程序,如果在系统调用或          库函数调用被阻止,然后执行以下操作之一:

   * 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),除非已在                套接字(请参见下文)。