#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <signal.h> #include <math.h> #include <fcntl.h> void fin_fils(int sig) { int statut; pid_t pid; printf("Un fils vient de se terminer\n"); pid = waitpid(0,&statut,WUNTRACED); if (WIFEXITED(statut)) { printf("exit status du processus fils %d\n", WEXITSTATUS(statut)); } if (WIFSIGNALED(statut)) { printf("signal recu par le fils %d\n", WTERMSIG(statut)); } if (WIFSTOPPED(statut)) { printf("Le fils a été stoppé, je le relance dans trois secondes\n"); sleep(3); printf("Ok on le réveille ce fainéant!\n"); kill(pid,SIGCONT); } } int main(int argc,char *argv[]) { struct sigaction action; int compteur = 0; pid_t pid; action.sa_handler = fin_fils; sigemptyset(&(action.sa_mask)); action.sa_flags = 0; sigaction(SIGCHLD,&action,NULL); pid = fork(); switch(pid) { case 0: printf("bonjour\n"); sleep(4); printf("je suis trop fatigué je m'arrête un peu...\n"); raise(SIGSTOP); printf("on m'a reveillé\n"); printf("Au revoir\n"); exit(0); break; case -1: exit(1); default: while (1) { printf("pere %d\n",++compteur); sleep(1); } } }