我研究发现,使用套接字编程时可能会发生信号中断。我搜索后发现,如果信号中断,我们应该重试。也就是说,我必须捕获错误并重试。我必须创建这样的套接字。
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;
}
在关闭,发送和连接功能的情况下,我应该遵循上述步骤吗?
答案 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),除非已在 套接字(请参见下文)。