signal kill exemple
Je vais essayer cet exemple que j'ai pris à partir de: 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);
}
Mais je ne vois pas la sortie de l'enfant du processus.
Est-il le comportement attendu? Si oui, pourquoi?
Merci beaucoup!
OriginalL'auteur Christian Wagner | 2011-06-09
Vous devez vous connecter pour publier un commentaire.
Votre code a une importante condition de course. Vous n'avez pas de s'assurer que l'enfant a terminé d'appeler
signal
avant que le parent envoie les signaux. Vous avez besoin d'utiliser une sorte de primitives de synchronisation pour faire le parent d'attente pour l'enfant à installer les gestionnaires, vous devez installer les gestionnaires de signaux avant de bifurquer de sorte que l'enfant hérite.Ici
le plus simpleje sais pour synchroniser les processus comme ceci:pipe(p)
créer un canal.fork()
.close(p[1]);
(l'écriture) etread(p[0], &dummy, 1);
close(p[0]);
etclose(p[1]);
après l'installation des gestionnaires de signaux.read
, vous pouvez être sûr que l'enfant a mis en place ses gestionnaires de signaux. Vous pouvez égalementclose(p[0]);
dans le parent à ce point.Edit 2: peut-être une meilleure et plus facile d'approche:
sigprocmask
pour bloquer tous les signaux et économiser de l'ancien masque de signal.sigprocmask
de nouveau à droite après la bifurcation pour restaurer le signal original masque.sigprocmask
après l'installation de l'gestionnaires de signaux pour restaurer le signal original masque.OriginalL'auteur R..
Vous devez utiliser getpid() au lieu de (pid).
OriginalL'auteur gkslsahin