【发布时间】:2019-02-07 08:59:33
【问题描述】:
我研究发现在使用套接字编程时可能会发生信号中断。我搜索了一下,发现万一出现信号中断,我们应该重试。也就是说,我必须捕获错误并重试。我必须像这样创建套接字。
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;
}
在关闭、发送和连接功能的情况下,我是否应该按照上述程序进行操作?
【问题讨论】:
-
EINTR绝对可以在send期间发生。您应该阅读每个系统调用的“手册页”;他们将详细说明每个错误情况以及任何特殊要求。例如,IIRC,对于send,重试时必须传递完全相同的参数。 -
对于
connect()和send()和其他类似操作(包括read()和write()),您应该考虑将函数包装在重试循环中。close()的情况比较棘手——最好假设它成功并且当调用返回时描述符不可用,即使errno == EINTR也是如此。我认为您的循环结构不好;它应该更像while ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { if (errno != EINTR) { perror("…"); exit(1); } }。循环体中有 5 行而不是 14 行(忽略循环体周围的大括号)。