
在 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 promontory123 2022-06-30 09:52:35 +08:00 用非阻塞不更好一点? |