当前位置: 技术问答>linux和unix
关于signal ()
来源: 互联网 发布时间:2014-11-19
本文导语: 在父进程中,为了处理僵尸子进程,声明子进程信号处理。 但发现只能处理第一个被fork的子进程,以后的就不再对信号进行相应了。 只有把signal()放到while (1)循环中,才能处理每一个被fork的子进程。 看了参考书,好...
在父进程中,为了处理僵尸子进程,声明子进程信号处理。
但发现只能处理第一个被fork的子进程,以后的就不再对信号进行相应了。
只有把signal()放到while (1)循环中,才能处理每一个被fork的子进程。
看了参考书,好像signal没必要这样调用的。
哪位大虾能给予详尽解释?//bow
void sig_chld (int signo)
{
waitpid (...);
}
main ()
{
...
signal (SIGCHLD, sig_chld);
while (1)
{
fork ();
}
}
但发现只能处理第一个被fork的子进程,以后的就不再对信号进行相应了。
只有把signal()放到while (1)循环中,才能处理每一个被fork的子进程。
看了参考书,好像signal没必要这样调用的。
哪位大虾能给予详尽解释?//bow
void sig_chld (int signo)
{
waitpid (...);
}
main ()
{
...
signal (SIGCHLD, sig_chld);
while (1)
{
fork ();
}
}
|
看一下signal()联机文档:
... If signal() is used, disp is the
address of a signal handler, and sig is not SIGILL, SIGTRAP,
or SIGPWR, the system first sets the signal's disposition to
SIG_DFL before executing the signal handler...
所以一般signal的使用方法是:
void sig_chld (int signo)
{
signal (SIGCHLD, sig_chld); // Must be declared again.
waitpid (...);
}
to wake2000(coucou) :
"waitpid只能针对特定的pid子进程"
waitpid 也可对所有子进程, waitpid(-1,...)
... If signal() is used, disp is the
address of a signal handler, and sig is not SIGILL, SIGTRAP,
or SIGPWR, the system first sets the signal's disposition to
SIG_DFL before executing the signal handler...
所以一般signal的使用方法是:
void sig_chld (int signo)
{
signal (SIGCHLD, sig_chld); // Must be declared again.
waitpid (...);
}
to wake2000(coucou) :
"waitpid只能针对特定的pid子进程"
waitpid 也可对所有子进程, waitpid(-1,...)
|
其实waitpid只能针对特定的pid子进程,如果单单是为了处理僵死进程,建议用
signal( SIGCHLD, SIG_IGN );
signal( SIGCLD, SIG_IGN );
直接将子进程返回的信号丢掉就可以了。
如果实在要用waitpid的话,可以开个指针,动态分配空间存储子进程的pid。
signal( SIGCHLD, SIG_IGN );
signal( SIGCLD, SIG_IGN );
直接将子进程返回的信号丢掉就可以了。
如果实在要用waitpid的话,可以开个指针,动态分配空间存储子进程的pid。
|
signal()函数在设置的使用只有一次有效,一旦接收信号后处理函数复原。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。