Aller au contenu

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


Faust

Messages recommandés

Posté(e)

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");

}

Posté(e)

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:

Posté(e)

: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..

Posté(e)

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);
}

Archivé

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

×
×
  • Créer...