cs_nanez
Messages postés5Date d'inscriptionlundi 15 décembre 2008StatutMembreDernière intervention 8 décembre 2011
-
5 déc. 2011 à 19:24
cs_nanez
Messages postés5Date d'inscriptionlundi 15 décembre 2008StatutMembreDernière intervention 8 décembre 2011
-
8 déc. 2011 à 19:35
Bonjour !!
je commence avec les processus en c; voici un petit programme que j'ai fais
#include
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(){
pid_t fils, petitfils, moi, pere;
fils=fork();
switch ( fils ) {
case -1 : printf("Erreur : echec du fork\n");
break;
case 0 : //processus fils
petitfils=fork();
switch ( petitfils ) {
case -1 : printf("Erreur : echec du fork\n");
break;
case 0 : //processus petit fils
moi = getpid();
pere=getppid();
printf("Bonjour je suis le petit fils, mon N° %d mon pere %d\n",moi,pere);
sleep (60);
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);
exit(0);
}
//Processus pere
moi = getpid();
pere = getppid();
printf("Bonjour je suis le pere, mon N° %d mon pere %d\n",moi,pere);
return 0;
}
il faut que le petit fils s'endort 60 secondes. Le fils tue alors le petit-fils et ses sorties. Le père attend que le fils termine et imprime "fils terminé"!! j'ai beau essayé je n'ai pas compris comment marche le kill() et waitpid()!!
quelqu'un pourrait il m'aider svp ??
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 7 déc. 2011 à 00:45
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.