Salut,
Pour commencer, kill sert à envoyer un signal à un processus, si tu veux tuer un processus c'est en effet un bon plan. Ensuite, wait(), waitpid() etc servent, lorsqu'un processus père a un ou plusieurs enfants, d'attendre que le statut d'un de ces enfants change. Je te propose une variante de ton code afin d'illustrer tout ça :
#include <sys/types.h>
#include <sys/wait.h>
#include
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
int main()
{
pid_t fils, petitfils, moi, pere;
int st;
fils = fork();
if (fils == -1)
printf("Erreur : echec du fork\n");
else if (fils == 0)
{
sleep(1);
petitfils = fork();
if (petitfils == -1)
printf("Erreur : echec du fork\n");
else if (petitfils == 0)
{
// le petit fils
sleep(1);
moi = getpid();
pere = getppid();
printf("Bonjour je suis le petit fils, mon N° %d mon pere %d\n",moi,pere);
sleep(30);
printf("Petit fils fini\n");
exit(0);
}
//Processus fils pere du petit fils
moi = getpid();
pere = getppid();
printf("Bonjour je suis le fils, mon N° %d mon pere %d\n", moi, pere);
sleep(3);
printf("Fils pas content, tue petit fils\n");
kill(petitfils, SIGQUIT);
wait(&st);
printf("Fils fini\n");
exit(0);
}
//Processus pere
moi = getpid();
pere = getppid();
printf("Bonjour je suis le pere, mon N° %d mon pere %d mon fils = %d\n", moi, pere, fils);
wait(&st);
printf("Papa fini\n");
return 0;
}
Et le résultat :
-> ./a.out
Bonjour je suis le pere, mon N° 8877 mon pere 6184 mon fils = 8878
Bonjour je suis le fils, mon N° 8878 mon pere 8877
Bonjour je suis le petit fils, mon N° 8879 mon pere 8878
Fils pas content, tue petit fils
Fils fini
Papa fini
Que s'est-il passé ?
Le papa fork. Il créé donc un fils. Ces deux processus s'exécutent en parallèle. Pendant que le père, grâce à wait(), attend que le fils se termine, le fils, lui, va patienter 1 seconde puis forker à son tour, et donc lancer le petit fils. Ce petit fils attend 1 seconde avant de se présenter puis passe en pause pendant 30 seconde pendant que le fils attend 3 secondes, puis tue le petit fils (qui finalement n'aura pas attendu ses 30 secondes et n'aura aps affiché son message de fin). Bien entendu le fils utilise wait afin de reprendre le status du petit fils, des fois que ça serve, puis se termine. Le fils étant fini, le père sort de son wait() et se termine à son tour.