【发布时间】:2016-10-20 01:22:16
【问题描述】:
我想用alarm()来设置recvfrom的超时时间。但是发现当使用signal()为SIGALRM注册一个handler时,一个SIGALRM已经被捕获,然后调用了signal handler。但是从处理程序返回后,recvfrom() 仍然阻塞,而没有数据进来,也没有EINTR 错误。为什么? signal() 是否自动设置 SA_RESTART 标志?
代码如下:
signal(SIGALRM, sig_handler);
while(1)
{
alarm(5);
n = recvfrom(sock, buf, BUF_MAX, 0, (struct sockaddr*)&addr, &len);
if(n < 0)
{
if(errno == EINTR)
{
printf("recvfrom timeout\n");
continue;
}
else
{
printf("recvfrom error\n");
}
}
else
{
printf("data: %s\n", buf);
alarm(0);
}
}
void sig_handler(int signo)
{
return;
}
【问题讨论】:
-
真正的问题是你为什么不使用 SO_RCVTIMEO?
标签: c linux unix networking network-programming