IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Demande d'aide processus


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Demande d'aide processus
    Bonjour tout le monde:

    Bon, je veux réalisé un petit programme C qui réalise les taches suivantes:
    1)Le père crée N fils.
    2)Chaque fils se termine de façon differente .
    3)Le processus père restera en boucle sur wait jusq u' à ce qu'il ne reste plus de fils.

    Le programme doit determiner la façon de terminer chaque fils, et doit egalement afficher les circanstances de terminaisons de chacun d'eux.


    j'ai fait un petit essai juste pour N=2, et j'avoue que je ne metrise pas assez les notions, mais si vous m'orientez, je serai vraiment reconnaissante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include <stdio.h>
    #include <unistd.h>
    #include<stdlib.h>
    #include <sys/wait.h>
     
    int info;
    pid_t res;
     
    int main(void)
    {
    	void affichage_type_terminaison(pid_t pid,int status);
    	int processus_fils(int numero);
    	pid_t pid;
    	int i;
    	int status_loc;
    	for(i=0;i<2;i++)
    	{
    		pid=fork();
    		if(pid==0)
    		{
    			printf("\n\nje suis fils de pid: %d mon pere est %d\n ",getpid(),getppid());
    			break;
    		}
    	}
     
    				processus_fils(i);
    				affichage_type_terminaison(getpid(),status_loc);
    				if((wait(&status_loc))!=getpid())
    				printf("\nje me reveille\n");
     
    return(EXIT_SUCCESS);
     
    }
     
    void affichage_type_terminaison(pid_t pid,int status_loc) 
    {
     
    		if(wait(&status_loc)==-1) printf("aucun fils a attendre\n");
    		else {if(WIFEXITED(info))
     
    			printf("\nmon pid est: %d et j'ai renvoye la valeur: %d\n",pid, WEXITSTATUS(info));
     
    		else
     
    			printf("Mon fils s'est arreté a cause d'un signal \n");
    }
    }
     
    int processus_fils(int numero) {
    switch(numero) {
    case(0):return(0);
    case(1):printf("je suis le fils, mon pid est: %d, et celui de mon pere est: %d \n",getpid(),getppid());
    sleep(5);
     
    			exit(2);
    }
    }

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Ton code est juste
    Ou est le probleme?

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    en fait il donne la valeur de retour juste pour un fils, mais normalement il doit le faire pour les deux

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/wait.h>
     
    void affichage_type_de_terminaison (pid_t pid, int status);
    int processus_fils (int numero);
     
    int main (void)
    {
       pid_t pid;
       int status;
       int numero_fils;
     
       for (numero_fils = 0; numero_fils < 4; numero_fils++)
       {
          switch (fork ())
          {
             case -1:
                fprintf (stderr, "Erreur dans fork()\n");
                exit (EXIT_FAILURE);
             case 0:
                fprintf (stdout, "Fils %d : PID = %ld\n",
                         numero_fils, (long) getpid ());
                return processus_fils (numero_fils);
             default:
                /* processus père */
                break;
          }
       }
     
       /* Ici il n'y a plus que le processus père */
     
       while ((pid = wait (&status)) > 0)
          affichage_type_de_terminaison (pid, status);
     
       return EXIT_SUCCESS;
    }
     
    void affichage_type_de_terminaison (pid_t pid, int status)
    {
       fprintf (stdout, "Le processus %ld ", (long) pid);
       if (WIFEXITED (status))
       {
          fprintf (stdout, "s'est terminé normalement avec le code %d\n",
                   WEXITSTATUS (status));
       }
       else if (WIFSIGNALED (status))
       {
          fprintf (stdout, "s'est terminé à cause du signal %d (%s)\n",
                   WTERMSIG (status), sys_siglist[WTERMSIG (status)]);
          if (WCOREDUMP (status))
          {
             fprintf (stdout, "Fichier image core créé\n");
          }
       }
       else if (WIFSTOPPED (status))
       {
          fprintf (stdout, "s'est arrêté à cause du signal %d (%s)\n",
                   WSTOPSIG (status), sys_siglist[WSTOPSIG (status)]);
       }
    }
     
    int processus_fils (int numero)
    {
       switch (numero)
       {
          case 0:
             return 1;
          case 1:
             exit (2);
          case 2:
             abort ();
          case 3:
             raise (SIGUSR1);
       }
       return numero;
    }

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci bien nicolas, c'était parfait ce code la, et ça marche à 100%. mais j'ai pas compris l'utilité de abort (), et même de WCOREDUMP, je n'en ai jamais entendu parler.

    Merci encore une fois nicolas et dot.net

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par ambition Voir le message
    Merci bien nicolas, c'était parfait ce code la, et ça marche à 100%. mais j'ai pas compris l'utilité de abort (), et même de WCOREDUMP, je n'en ai jamais entendu parler.
    tu es sincère? D'ou vient le code que tu as posté?

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    tu es sincère? D'ou vient le code que tu as posté?
    le code que j'ai posté, je l'ai fait toute seule, et je pense ça parait bien que c'est un niveau debutant, mais j'ai pas parlé de abort() ou WCOREDUMP parceque je sais même pas c'est quoi et je suis sincère.

    En fait, c'est pourquoi j'ai pris n=2, parceque je connais pas d'autres façons pour terminer mes processus

    Je viens de débuter la dedans et donc mes connaissances sont trop trop trop... limitées

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Merci encore une fois nicolas, c'est vraiment gentil

    Bonne journée!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/04/2012, 12h08
  2. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  3. demande d'aide sur samba
    Par marcoss dans le forum Développement
    Réponses: 5
    Dernier message: 04/12/2003, 19h38
  4. [TPW][cours]Demande d'aide pour finir un programme
    Par jf dans le forum Turbo Pascal
    Réponses: 21
    Dernier message: 16/06/2003, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo