50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
#include <stdio.h> /* entrées sorties */
|
|
#include <unistd.h> /* pimitives de base : fork, ...*/
|
|
#include <stdlib.h> /* exit */
|
|
#include <signal.h> /* traitement des signaux */
|
|
|
|
/* Traitant du signal */
|
|
void handler_sigint(int signal_num) {
|
|
printf("\nProcessus de pid %d : J'ai reçu le signal %d\n", getpid(),signal_num);
|
|
return;
|
|
}
|
|
|
|
void dormir(int nb_secondes) {
|
|
for (int i = 0; i < nb_secondes; i++) {
|
|
sleep(1);
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
int retour;
|
|
int duree_sommeil = 60;
|
|
|
|
/* associer un traitant au signal USR2 */
|
|
signal(12, handler_sigint);
|
|
|
|
printf("\nPère, pid=%d.\n", getpid());
|
|
|
|
retour = fork();
|
|
|
|
/* Bonne pratique : tester systématiquement le retour des appels système */
|
|
if (retour < 0) { /* échec du fork */
|
|
printf("Erreur fork\n");
|
|
/* Convention : s'arrêter avec une valeur > 0 en cas d'erreur */
|
|
exit(1);
|
|
}
|
|
|
|
if (retour == 0) { // fils
|
|
printf("\nFils, pid=%d, ppid=%d.\n", getpid(), getppid());
|
|
dormir(duree_sommeil);
|
|
/* Important : terminer un processus par exit */
|
|
exit(EXIT_SUCCESS); /* Terminaison normale (0 = sans erreur) */
|
|
}
|
|
else { // père
|
|
printf("\nPère (%d), mon fils=%d.\n", getpid(), retour);
|
|
}
|
|
|
|
dormir(duree_sommeil+2);
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|