V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Fanhe
V2EX  ›  问与答

关于 Linux 中 alarm 的疑问

  •  
  •   Fanhe · 2022-06-30 09:23:51 +08:00 · 663 次点击
    这是一个创建于 663 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    1 条回复    2022-06-30 09:52:35 +08:00
    promontory123
        1
    promontory123  
       2022-06-30 09:52:35 +08:00
    用非阻塞不更好一点?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1713 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:40 · PVG 00:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.