Faust Posted April 10, 2004 Share Posted April 10, 2004 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 More sharing options...
Irgoff Posted April 10, 2004 Share Posted April 10, 2004 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 Link to comment Share on other sites More sharing options...
Faust Posted April 10, 2004 Author Share Posted April 10, 2004 ca explique bien des choses !!! 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 More sharing options...
Irgoff Posted April 11, 2004 Share Posted April 11, 2004 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 More sharing options...
Faust Posted April 11, 2004 Author Share Posted April 11, 2004 ca me donne un beau "segmentation fault" Bon, enfin, merci pour ton aide, je vais essayer de trouver le problème Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.