Jump to content

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


Recommended Posts

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

}

Link to comment
Share on other 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:

Link to comment
Share on other 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..

Link to comment
Share on other 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);
}

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...