6

关于 Linux 中 alarm 的疑问

 2 years ago
source link: https://www.v2ex.com/t/863099
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  问与答

关于 Linux 中 alarm 的疑问

  Fanhe · 55 分钟前 · 101 次点击

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK