kill-signal Beispiel
Ich versuche dieses Beispiel, das ich mitgenommen habe: http://www.cs.cf.ac.uk/Dave/C/node24.html:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.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 */
printf("\nI am the new child!\n\n");
signal(SIGHUP,sighup); /* set function calls */
signal(SIGINT,sigint);
signal(SIGQUIT, sigquit);
printf("\nChild going to loop...\n\n");
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);
}
Aber ich sehe keinen Ausgang aus der Kind-Prozess.
Ist es das erwartete Verhalten? Wenn ja; warum?
Vielen Dank!
InformationsquelleAutor Christian Wagner | 2011-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code hat einen großen race-Bedingung. Sie sind nicht dafür sorgen, dass das Kind beendet hat, ruft
signal
bevor die Eltern sendet die Signale. Sie müssen entweder eine Art von Synchronisations-primitive, um die Eltern für das Kind warten, um installieren Sie den Handler oder zu installieren, müssen Sie die signal-Handler vor der Gabelung, damit das Kind erbt.Hier ist
einfachsteWeg den ich kenne zur Synchronisation von Prozessen wie diesem:pipe(p)
zum erstellen einer pipe.fork()
.close(p[1]);
(das schreiben Ende) undread(p[0], &dummy, 1);
close(p[0]);
undclose(p[1]);
nach der Installation der signal-Handler.read
können Sie sicher sein, dass das Kind setup signal Handler. Sie können auchclose(p[0]);
im Eltern an dieser Stelle.Edit 2: Vielleicht eine bessere und einfachere Methode:
sigprocmask
blockiert alle Signale und speichern Sie die alte signal-Maske.sigprocmask
wieder rechts nach der Gabelung, um wieder die ursprüngliche signal-Maske.sigprocmask
direkt nach der Installation der signal-Handler, um wieder die ursprüngliche signal-Maske.InformationsquelleAutor R..
Sollten Sie verwenden, getpid() anstelle von pid().
InformationsquelleAutor gkslsahin