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; }