当前位置: 技术问答>linux和unix
哪位高手可以解释一下为什么Linux下的socket函数recv(),不被信号中断掉?
来源: 互联网 发布时间:2015-01-08
本文导语: Linux下用recv()接收数据时,产生了一个信号并被捕获,但信号处理完后recv()仍在阻塞,这是怎么回事? 据我所知(也许才疏学浅,知道得并不正确),recv()应该立即返回,并设errno为EINTR,我试了SIGALRM、SIGUSR1信号结果...
Linux下用recv()接收数据时,产生了一个信号并被捕获,但信号处理完后recv()仍在阻塞,这是怎么回事?
据我所知(也许才疏学浅,知道得并不正确),recv()应该立即返回,并设errno为EINTR,我试了SIGALRM、SIGUSR1信号结果都是recv()没有被中断,但在HP操作系统上,recv()是被中断了,而且recv()的帮助中也是说收到信号会中断调用,这是怎么回事?
哪位高手可以解释一下?
据我所知(也许才疏学浅,知道得并不正确),recv()应该立即返回,并设errno为EINTR,我试了SIGALRM、SIGUSR1信号结果都是recv()没有被中断,但在HP操作系统上,recv()是被中断了,而且recv()的帮助中也是说收到信号会中断调用,这是怎么回事?
哪位高手可以解释一下?
|
有一些系统默认设置是重新调用(并非不被中断),请参考如下代码(UNIX网络编程5.6):
#include "some.h"
Sigfunc *
signal(int signo,Sigfucn *fucn)
{
struct sigaction act,oact;
act.sa_handler = func;
sigemptyset(act.sa_mask);
act.sa_flags=0;
if (signo==SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /*SunOS 4.x */
#endif
}else{
#ifdef SA_RESTART
act.sa_flags |=SA_RESTART;
#endif
}
sigaction(signo,&act,&oact);
return(oact.sa_handler);
}
(有修改)
简单的说,通过sigaction结构中的sa_mask可以设置开关。
#include "some.h"
Sigfunc *
signal(int signo,Sigfucn *fucn)
{
struct sigaction act,oact;
act.sa_handler = func;
sigemptyset(act.sa_mask);
act.sa_flags=0;
if (signo==SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /*SunOS 4.x */
#endif
}else{
#ifdef SA_RESTART
act.sa_flags |=SA_RESTART;
#endif
}
sigaction(signo,&act,&oact);
return(oact.sa_handler);
}
(有修改)
简单的说,通过sigaction结构中的sa_mask可以设置开关。
|
如果系统调用是自动再启动的,则当SIGALRM信号处理程序返回时,recv函数并不被中止
|
就这样
signal(SIGUSR1,SIG_IGN);
signal(SIGVTALRM,SIG_IGN);
signal(SIGPIPE,SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGVTALRM,SIG_IGN);
signal(SIGPIPE,SIG_IGN);
|
帮你up一下吧