多进程退出的问题

 

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

 




posted @ 2016-03-31 13:55  孤火  阅读(377)  评论(2编辑  收藏  举报