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

问题描述 投票:0回答:1

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

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;

}

如果关闭,发送和连接功能,我应该遵循上述程序吗?

c linux sockets tcp
1个回答
2
投票

是否需要检查所有插座操作的EINTR?是的,理想情况下你应该检查。不仅socket()有很多系统调用报告EINTR ERRORS如果在系统调用正在进行时发生信号。

来自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),除非在套接字上设置了超时(见下文)。

© www.soinside.com 2019 - 2024. All rights reserved.