在 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
用非阻塞不更好一点?
|