signal

1. 多线程中,一个线程阻塞在recv,另一个线程向它发信号试图唤醒阻塞线程失败,

仍然阻塞在recv调用。

解决方法:a.给socket设置recv超时选项: setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

tv所代表的时间不能为0,也不能太长。

tv时间最长能有多长取决于系统实现,我在Fedora18 64bitPC上测试时可以设置1个月,但是在LFS x86 32bits上测试失败。当LFS系统设置短时间如10分钟的超时值时信号是可以唤醒recv的,但未尝试测出边界值。


b. 使用sigaction,sa_flag不能设为SA_RESTART。ex:
 static Sigfunc* _signal(int signum, Sigfunc* func)
 {
     struct sigaction act, oact;
 
     act.sa_handler = func;
     sigemptyset(&act.sa_mask);
     act.sa_flags = 0;
 #if 0
     if (signum != SIGALRM)
         act.sa_flags |= SA_RESTART;//SA_NODEFER;
 #endif
     if (sigaction(signum, &act, &oact) < 0)
         return (SIG_ERR);
     return oact.sa_handler;
 }


你可能感兴趣的:(多线程,Signal)