2016-11-09 7 views
0

Hallo, was ich hier zu tun versuche, ist ein Programm, das beginnt, indem es seine PID in der Datei server.lock registieren, dann sollte es ein fork() tun. Der Sohn sollte sagen, dass es anfing zu arbeiten, als passiv zu warten und das Signal SIGUSR2 zu bewaffnen, und wenn es es empfängt, sollte es seine Ausführung beenden und "Auf Wiedersehen grausame Welt" schreiben. Der Elternteil sollte schreiben, es begann und passiv warten und dann die Signale SIGUSR1 und SIGINT scharf schalten. Wenn es SIGUSR1 empfängt, sollte es selbst das Signal SIGUSR2 an den Sohn senden, und wenn es das Signal SIGINT empfängt, wenn es es das erste Mal empfängt, sollte es sagen, dass es das Signal erhalten hat, wenn es das zweite Mal das Signal SIGUSR2 senden soll der Sohn, damit endet der Sohn und es ist die Hinrichtung. Jetzt ist mein Problem mit dem Elternteil, ich weiß nicht warum, aber beim zweiten Mal erhält es das Signal es heißt den Fehler "User defined signal 2" und geht, wenn mir jemand erklären könnte was ich hier falsch mache würde ich sehr zu schätzen wissen. Hier ist der Code. Vielen Dank.Programm mit fork() und Signalverarbeitung in c

int p = 1; 
int son; 

void handle_SIGINT(int signal){ 
    if (p==1) { 
    p = 2; 
    printf("The authentication module received the signal SIGINT\n"); 
    }else{ 
    kill(son, SIGUSR2); 
    exit(0); 
    } 
} 

void handle_SIGUSR1(int signal){ 
    kill(son, SIGUSR2); 
} 

void handle_SIGUSR2(int signal){ 
    printf("Goodbye cruel world\n"); 
    exit(0); 
} 

void main(){ 


    int pid = getpid(); 
    FILE *f = fopen("server.lock", "w"); 
    fprintf(f, "%d", pid); 
    fclose(f); 

int n = fork(); 

    if (n==0) { 
     printf("The message handling module has started\n"); 
     signal(SIGUSR2, handle_SIGUSR2); 
     while(1) 
       pause(); 
    }else{ 
     printf("The authentication module has started\n"); 

     son = getpid(); 

     signal(SIGUSR1, handle_SIGUSR1); 

     signal(SIGINT, handle_SIGINT); 

     while(1) 
      pause(); 
    } 
} 
+0

IIRC der Signal-Handler ist nicht gesetzt, wenn er aufgerufen wird, was bedeutet, dass er sich selbst neu setzen muss. – immibis

+0

Es tut mir leid, aber sind nicht alle 3 Signal-Handler vor dem Haupt definiert werden? Ich meine zum ersten Mal (für das Signal SIGINT) funktioniert das Elternteil einwandfrei, das Problem ist das zweite Mal. – GamerGirl

+0

Mögliches Duplikat von [Was ist der Unterschied zwischen Signal und Signal?] (Http://stackoverflow.com/questions/231912/what-is-the-difference-between-sigaction-and-signal) –

Antwort

0

Ihre Benennung verwirrte mich. Es scheint, dass Ihr Problem Ihre Variable son ist. Das ist nicht der Sohn alias Kindprozess. Das ist das Elternteil.

Der Anruf fork wird zweimal zurückgegeben. Einmal im Elternteil und einmal im Kind. Im Elternteil wird die PID des Kindes zurückgegeben. Es gibt 0 im Kind zurück. Du hast sie umgekehrt!

Sie verwenden signal anstelle von sigaction. Ich empfehle, sigaction zu verwenden. Es ist viel komplizierter, bietet aber auch viele weitere Möglichkeiten.

Das Problem, das Sie mit signal haben, ist, dass nach dem Aufruf des Handlers das Signal auf das Standardverhalten zurückgesetzt wird. Aber das ist auch nicht garantiert. Die GNU C-Bibliothek verhält sich unterschiedlich, je nachdem ob _BSD_SOURCE, _GNU_SOURCE oder nichts definiert ist. Das heißt, wie es sich unter BSD UNIX oder SYSV UNIX verhält. Und deshalb ist sigaction eine bessere Wahl, es verhält sich auf jedem POSIX-System gleich.

+0

Es tut mir leid, aber ruft nicht getpid() auf die Eltern zurück die Pid des Sohnes und ruft es auf den Sohn zurück 0? Deshalb habe ich getpid() auf dem else in main aufgerufen (Sorry, wenn es eine dumme Frage ist) – GamerGirl

+0

@ j.DOH: Es ist leicht, sich selbst zu sehen. Drucke die Werte von 'pid' und' son' aus. –

+0

@ Zan Lynx Ok vielen Dank für die Hilfe, ich schätze es wirklich. – GamerGirl