Aller au contenu
View in the app

A better way to browse. Learn more.

Next

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

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)
  • Auteur

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

Posté(e)
  • Auteur

ca me donne un beau "segmentation fault" :francais:

Bon, enfin, merci pour ton aide, je vais essayer de trouver le problème :censored:

Archivé

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.