Faust Posté(e) le 10 avril 2004 Partager Posté(e) le 10 avril 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"); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Irgoff Posté(e) le 10 avril 2004 Partager Posté(e) le 10 avril 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Faust Posté(e) le 10 avril 2004 Auteur Partager Posté(e) le 10 avril 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.. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Irgoff Posté(e) le 11 avril 2004 Partager Posté(e) le 11 avril 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); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Faust Posté(e) le 11 avril 2004 Auteur Partager Posté(e) le 11 avril 2004 ca me donne un beau "segmentation fault" Bon, enfin, merci pour ton aide, je vais essayer de trouver le problème Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.