#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <assert.h>
int run = 1;
//这里没有执行
void waitChild(int signo)
{
int status;
int pid;
while( ( pid = waitpid(-1, &status, 0 ) ) > 0)
{
printf( "44444child exist pid=%d \n" , pid );
}
printf( "555waitChild End \n");
}
void exitChild( int signo )
{
if( signo == SIGTERM )
{
printf( "2222child recv sig term pid=%d \n" , getpid() );
run = 0;
}
}
void worker()
{
signal(SIGTERM , exitChild );
signal(SIGINT , exitChild );
while( run == 1 )
{
printf("worker running pid=%d...\n" , getpid() );
sleep( 1 );
}
printf( "3333worker exit pid=%d \n" , getpid() );
exit( 0 );
}
void killChild( int signo )
{
if( signo == SIGINT )
{
printf( "1111kill child \n");
kill( 0 , SIGTERM );
}
}
int main()
{
int i;
pid_t pid;
signal(SIGCHLD, waitChild );
signal(SIGINT , killChild );
//子进程退出时触发
for(i=0; i<3; i++)
{
pid = fork();
if(pid == 0)
{
//child process
worker();
}
}
if(pid>0) {
printf("press Enter to exit...");
getchar();
}
return 0;
}
只执行了123 步,4,5没有触发,
SIGCHLD 应该在子进程退出时,触发,但是没有触发。
为了证明SIGCHLD确实可以触发,进行一下修改,子进程sleep(4)后,退出并触发了waitChild , 为什么上面的没有触发。
#include <stdio.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <assert.h> int run = 1;
//这里执行了 void waitChild(int signo) { int status; int pid; while( ( pid = waitpid(-1, &status, 0 ) ) > 0) { printf( "44444child exist pid=%d \n" , pid ); } printf( "555waitChild End \n"); } void exitChild( int signo ) { if( signo == SIGTERM ) { printf( "2222child recv sig term pid=%d \n" , getpid() ); run = 0; } } void worker() { signal(SIGTERM , exitChild ); signal(SIGINT , exitChild ); while( run == 1 ) { printf("worker running pid=%d...\n" , getpid() ); sleep( 4 ); exit( 0 ); } printf( "3333worker exit pid=%d \n" , getpid() ); } void killChild( int signo ) { if( signo == SIGINT ) { printf( "1111kill child \n"); kill( 0 , SIGTERM ); } } int main() { int i; pid_t pid; signal(SIGCHLD, waitChild ); //子进程退出时触发 for(i=0; i<3; i++) { pid = fork(); if(pid == 0) { //child process worker(); } } if(pid>0) { printf("press Enter to exit..."); getchar(); } return 0; }