在 Linux 中 alarm 设置一个时长,计时结束之后会发送一个 SIGALARM 信号,有没有这样一种可能性:alarm 这一行代码之后的其他代码还没来得及执行(可能系统的负载非常大等原因),alarm 就 timeout 了,触发了信号,假设我们捕获了这个信号,直接返回。那么这个 alarm 调用就没有起到任何作用,这是不是说:用 alarm 编写的代码都不是一个健壮的程序
//signal handler
static void recvfrom_alarm(int signo)
{
return;
}
//UDP 中使用 alarm 设置超时
#define MAXLINE 1024
void dg_cli(FILE *fp, int sockfd, const sockaddr* servaddr, socklen_t serlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE+1];
singal(SIGALRM, recvfrom_alarm);
while(fgets(sendline,MAXLINE,fp)!=NULL){
sendto(sockfd, sendline, strlen(sendline),0,servaddr,serlen);
alarm(2); //设置 2s 后超时
if((n = recvfrom(sockfd, recvline,MAXLINE,0,NULL,NULL))<0){
//...异常流处理
}
else{
//...正常流处理
}
}
}
如果上述代码的 alarm 之后还没开始执行 recvfrom 就 timeout 了,那么程序而 sendto 发出到 UDP 包丢失了,那么程序是不是就永远阻塞了?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.