2010-11-24 14 views
0

Ich habe ein Beispiel von dieser Website versucht: http://www.cs.cf.ac.uk/Dave/C/node24.html Manchmal zeigt die Ausgabe nicht die Nachricht von untergeordneten Prozessen. Ich versuche zu verstehen, warum? Kann jemand helfen?Kind Prozess funktioniert nicht richtig

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

Antwort

1

Weil manchmal der Elternteil geplant ist, bevor das Kind läuft und manchmal umgekehrt. Wenn das Kind die Handler bei der Übermittlung der Signale nicht eingestellt hat, sehen Sie Ihre Nachrichten nicht.

+2

die Lösung - stellen Sie die Signalhandler vor dem 'fork()' und dann im Elternteil – tobyodavies

+0

@tobyodavies: Ich bin mir nicht sicher, was du meinst. Können Sie einige Änderungen veröffentlichen? – root

1

können Sie Eltern senden ein Signal nach Kind alle seine Griffe gesetzt hat

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

und stellen Sie sicher, dass die Eltern für die Signalpause mit warten()

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); 

Ihr Handler, Griffe SOMESIGNAL kann wie folgt implementiert werden

void sig_somesignal() 
{ 
    return; 
    }