当前位置: 技术问答>linux和unix
为何signal 在函数处理没有打印设置的输出消息!
来源: 互联网 发布时间:2016-04-28
本文导语: 如题:红色部分为标记关键部分,后面有问题 整个函数是让父进程fork N个子进程,然后输 出子进程的状态,在子进程结束时提示(signal截取) /*solution for 8_10 */ #include #include #include #include void child_hander (int ...
如题:红色部分为标记关键部分,后面有问题
整个函数是让父进程fork N个子进程,然后输
出子进程的状态,在子进程结束时提示(signal截取)
[root@localhost solutions]# ./8_10 3
child 5485 here , will slep for 0 seconds
my pid is : 5484
status : exit =17 , sig = 0 , core = 0 为什么第一次没有SIGCHLD comming ...
child 5486 here , will slep for 1 seconds
my pid is : 5484
waiting ...
SIGCHLD comming ...
status : exit =17 , sig = 0 , core = 0
child 5487 here , will slep for 2 seconds
my pid is : 5484
waiting ...
waiting ...
SIGCHLD comming ...
status : exit =17 , sig = 0 , core = 0
整个函数是让父进程fork N个子进程,然后输
出子进程的状态,在子进程结束时提示(signal截取)
/*solution for 8_10 */
#include
#include
#include
#include
void child_hander (int ) ;
void parent_hander (int ) ;
void sig_hander( int ) ;
int main ( int argc , char **argv )
{
int n , i ;
int pid ;
if ( argc != 2 )
{
fprintf( stderr ," usage: %s n n" , argv[0] ) ;
exit ( 1 ) ;
}
if ( !(n = atoi ( argv[1] ) ))
{
fprintf(stderr, " The number of fork() is ZERO n");
exit ( 1 ) ;
}
for ( i = 0 ; i 8 ;
low_7 = status & 0x7f ;
bit_7 = status &0x80 ;
printf ("status : exit =%d , sig = %d , core = %d n " , hig_8 , low_7 , bit_7 ) ;
}
void sig_hander(int sig_id )
{
printf (" SIGCHLD comming ...n" ) ;
}
[root@localhost solutions]# ./8_10 3
child 5485 here , will slep for 0 seconds
my pid is : 5484
status : exit =17 , sig = 0 , core = 0 为什么第一次没有SIGCHLD comming ...
child 5486 here , will slep for 1 seconds
my pid is : 5484
waiting ...
SIGCHLD comming ...
status : exit =17 , sig = 0 , core = 0
child 5487 here , will slep for 2 seconds
my pid is : 5484
waiting ...
waiting ...
SIGCHLD comming ...
status : exit =17 , sig = 0 , core = 0
|
首先 你代码有错误
34 else if ( pid ==0 )
35 child_hander ( i ) ;
应该是i 不是 5
其次 不要把signal ( SIGCHLD , sig_hander ) ; 放分支函数
放主函数吧 你的第一个子进程退出的时候 父进程还没有安装好handler 你让他咋捕获信号
最后 代码很难看 不好的风格 wait最好是用在 sig_handler里面
over
34 else if ( pid ==0 )
35 child_hander ( i ) ;
应该是i 不是 5
其次 不要把signal ( SIGCHLD , sig_hander ) ; 放分支函数
放主函数吧 你的第一个子进程退出的时候 父进程还没有安装好handler 你让他咋捕获信号
最后 代码很难看 不好的风格 wait最好是用在 sig_handler里面
over