关于 Linux 中 alarm 的疑问

2022-06-30 09:23:51 +08:00
 Fanhe

在 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 包丢失了,那么程序是不是就永远阻塞了?

667 次点击
所在节点    问与答
1 条回复
promontory123
2022-06-30 09:52:35 +08:00
用非阻塞不更好一点?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863099

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX