Processus en C

[Résolu]
Signaler
Messages postés
5
Date d'inscription
lundi 15 décembre 2008
Statut
Membre
Dernière intervention
8 décembre 2011
-
Messages postés
5
Date d'inscription
lundi 15 décembre 2008
Statut
Membre
Dernière intervention
8 décembre 2011
-
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 ??

2 réponses

Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
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.
Messages postés
5
Date d'inscription
lundi 15 décembre 2008
Statut
Membre
Dernière intervention
8 décembre 2011

merciii pour ton aide TychoBrahe; j'ai compris ce que qui n'allais pas