2010-11-24 136 views
0

我尝试了一个来自此网站的示例:http://www.cs.cf.ac.uk/Dave/C/node24.html 有时,输出不会显示来自子进程的消息。 我想明白为什么?任何人都可以帮忙吗?子进程无法正常工作

#include <stdio.h> 
#include <signal.h> 

void sighup(); /* routines child will call upon sigtrap */ 
void sigint(); 
void sigquit(); 

main() 
{ int pid; 

    /* get child process */ 

    if ((pid = fork()) < 0) { 
     perror("fork"); 
     exit(1); 
    } 

    if (pid == 0) 
    { /* child */ 
     signal(SIGHUP,sighup); /* set function calls */ 
     signal(SIGINT,sigint); 
     signal(SIGQUIT, sigquit); 
     for(;;); /* loop for ever */ 
    } 
    else /* parent */ 
    { /* pid hold id of child */ 
     printf("\nPARENT: sending SIGHUP\n\n"); 
     kill(pid,SIGHUP); 
     sleep(3); /* pause for 3 secs */ 
     printf("\nPARENT: sending SIGINT\n\n"); 
     kill(pid,SIGINT); 
     sleep(3); /* pause for 3 secs */ 
     printf("\nPARENT: sending SIGQUIT\n\n"); 
     kill(pid,SIGQUIT); 
     sleep(3); 
    } 
} 

void sighup() 

{ signal(SIGHUP,sighup); /* reset signal */ 
    printf("CHILD: I have received a SIGHUP\n"); 
} 

void sigint() 

{ signal(SIGINT,sigint); /* reset signal */ 
    printf("CHILD: I have received a SIGINT\n"); 
} 

void sigquit() 

{ printf("My DADDY has Killed me!!!\n"); 
    exit(0); 
} 

回答

1

因为有时父母会在孩子运行之前被安排,有时反之亦然。如果孩子在信号传递时没有设置处理程序,则看不到您的消息。

+2

解决方案 - 在fork()之前设置信号处理程序然后在父项中取消设置 – tobyodavies 2010-11-24 02:46:58

1

孩子已经将所有他把手

if (pid == 0) 
{ /* child */ 
    signal(SIGHUP,sighup); /* set function calls */ 
    signal(SIGINT,sigint); 
    signal(SIGQUIT, sigquit); 
    kill(getppid() , SOMESIGNAL); 
    for(;;); /* loop for ever */ 
} 

,并确保父将使用暂停()

pause(); 
    printf("\nPARENT: sending SIGHUP\n\n"); 
    kill(pid,SIGHUP); 
    sleep(3); /* pause for 3 secs */  
    printf("\nPARENT: sending SIGINT\n\n"); 
    kill(pid,SIGINT); 
    sleep(3); /* pause for 3 secs */ 
    printf("\nPARENT: sending SIGQUIT\n\n"); 
    kill(pid,SIGQUIT); 
    sleep(3); 

你的处理程序等待信号后,您可以发送父的信号句柄SOMESIGNAL可以这样实现

void sig_somesignal() 
{ 
    return; 
    }