J’essaie d’écrire un programme C dans lequel le processus parent suspend le processus enfant et, après quelques secondes, continue de l’exécuter.
#include #include #include #include void sigstop(); void sigcont(); void sigquit(); int main() { int pid; if ((pid = fork()) < 0) { perror("fork"); exit(1); } if (pid == 0) { /* child */ signal(SIGSTOP,sigstop); signal(SIGCONT,sigcont); signal(SIGQUIT, sigquit); for(;;); /* loop for ever */ } else { printf("\nPARENT: sending SIGSTOP to suspend the process\n\n"); kill(pid, SIGSTOP); sleep(5); printf("\nPARENT: sending SIGCONT to continue the suspended process\n\n"); kill(pid, SIGCONT); sleep(5); printf("killing child"); kill(pid,SIGQUIT); sleep(5); } } void sigstop() { printf("CHILD: I've been suspended\n"); } void sigcont() { printf("CHILD: I'm back\n"); } void sigquit() { printf("My DADDY has Killed me!!!\n"); exit(0); }
printf
dans sigstop()
n’est jamais exécuté et sigquit()
est appelé avant printf("killing child");
. Comment cela se produit-il et comment puis-je obtenir la sortie dans le bon ordre?
Si vous lisez la page de manuel signal(7)
vous verrez que
Les signaux
SIGKILL
etSIGSTOP
ne peuvent pas être interceptés, bloqués ou ignorés.
Vous ne pouvez tout simplement pas attraper ce signal.
Le dernier bit, à propos de "Killing child"
est très facile à corriger: il ajoute une nouvelle ligne à la chaîne que vous imprimez.
Ceci est dû au fait que la sortie sur stdout
(qui correspond à ce que printf
écrit) est par défaut tamponnée en ligne . Cela signifie que le tampon interne de stdout
est vidé (c’est-à-dire réellement écrit sur le terminal) sur une nouvelle ligne. Si vous n’avez pas la nouvelle ligne, le tampon sera vidé lorsque le processus se terminera, c’est-à-dire après que vous ayez quitté le processus enfant.