Aller au contenu

Processus père fils, pas sûr de mon programme


Faust

Messages recommandés

Vous en pensez quoi? il me semble que c'est pas très clair...

-crée N processus fils,

-se met en attente de ces N processus fils,

-visualise leur identité (Pid_Fils ) au fur et à mesure de leurs terminaisons.

-visualise son pid et celui de son père,

-se met en attente pendant 2*i secondes,visualise la fin de l'attente,

-met fin à sa propre existence par envois d’un signal d’interruption à lui même.

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void
usage (command_name)
{
 printf ("usage : %s nombres de fils\n", command_name);
 exit (1);
}

static void
un_fils (void)
{
 pid_t pid;
 int epid, fpid;

 epid = getpid ();
 fpid = getppid ();

 printf("\nIdentite de l'enfant : %d",epid);
 printf("\nIdentite du pere : %d\n",fpid);
 (void) sleep (2);
}

int main (int argc, char *argv [])
{
 int N;
 int i;

 if (argc != 2) usage (*argv);

 N =  strtol (argv[1], NULL, 10);
 printf ("Creation de %d fils\n", N);

 /* On lance N fils */
 for (i=0; i<N; i++)
   switch (fork ()) {
case -1 :
       perror ("Fork");
       exit (1);
     case 0 : /* le fils */
       un_fils ();
       /* erreur un fils revient ! */
       exit (1);

   }
printf("\nMise en attente pendant 2 secondes des processus fils \n");


 /* On attend les fils (qui se font tuer...) */
 for (i=0; i<N; i++) {
   int status;
   pid_t fils;
   fils = wait (&status);
   kill(fils,SIGUSR1);
   printf ("\nLe fils s'envoie un signal pour se tuer", fils);
   printf ("\nLe fils %d est termine\n",fils);
 }

 /* FIN */
 printf ("\nTous les fils ont termine\n");

}

Lien vers le commentaire
Partager sur d’autres sites

Le problème est que le wait() attend qu'un des processus fils se termine. Juste en dessous tu appelles kill() pour le tuer mais il est déjà mort puisque le wait a rendu la main !

De plus, comme tous les fils attendent 2s, le wait n'attendra que le premier : les autres fils mourront de leur belle mort grâce au exit(1), et le wait te renverra -1 comme pid. Tu devrais donc faire un check sur le retour de wait(), ça évitera d'envoyer un kill -1 :craint:

Lien vers le commentaire
Partager sur d’autres sites

:mdr: ca explique bien des choses !!! :yes:

Comme je suis pas très bon programmeur, j'y vais par essais/erreurs et ca sort souvent quelques choses de bizzares...

Et comment je fait ca un "check" ? J'arrive pas non plus à juste mettre un kill..

Lien vers le commentaire
Partager sur d’autres sites

Par "check" je voulais juste dire de vérifier la valeur de retour :

if(fils = wait (&status) != -1)
{
//pas besoin puisque le fils est déjà mort->    kill(fils,SIGUSR1);
...
}

Si tu veux juste faire un kill(), tu peux stocker le pid des fils (le retour du fork() dans le process père) dans un tableau, pour ensuite faire des kill() à la chaine.

...
tabpid[i] = fork();
switch(tabpid[i])
{
...
}
for ...
{
   if(tabpid[i]>0)
       kill(tabpid[i],SIGUSR1);
}

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...