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 :

Gestion des Processus sur Linux


Sujet :

C

  1. #1
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut Gestion des Processus sur Linux
    Salut tous le monde ;

    j'essaye de creer des Processus(fork) sur linux.

    Sur la photo Nom : fork.png
Affichages : 109
Taille : 14,2 Ko vous pouvez voir ce que j'aimerais programmer.

    Bon voici mon code ecrit :

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
     
     
    int main(void){
     
        pid_t kind2;
        pid_t kind3;
        pid_t kind4;
        pid_t kind5;
        pid_t kind6;
     
        kind2 = fork();
     
        if(kind2 < 0) {
          fprintf(stderr, "cannot fork, error %d\n", errno);
          exit(EXIT_FAILURE);      
        }
     
        if(kind2 == 0)
        {
    	printf("[PID: %d, PPID: %d ] i'm Process 2\n", getpid(), getppid() );       
     
    	kind3 = fork();
    	if(kind3 < 0)
    	{
    	  fprintf(stderr, "cannot fork, error %d\n", errno);
    	  exit(-3);      
    	}
    	if(kind3 == 0)
    	{
    	  printf("[PID: %d, PPID: %d ] i'm Process 3\n", getpid(), getppid() );
    	  exit(32);
    	}
    	/*if(kind3 > 0)
    	{
    	  printf("[PID: %d, PPID: %d ] i'm  Process 1\n", getpid(), getppid() );
    	}*/
     
    	exit(2);
        }  
     
        if(kind2 > 0){
          printf("[PID: %d, PPID: %d ] i'm Process 1\n", getpid(), getppid() );
     
          kind4 = fork();
          if(kind4 < 0)
          {
    	fprintf(stderr, "cannot fork, error %d\n", errno);
    	exit(-4);      
          }
          if(kind4 == 0)
          {
    	printf("[PID: %d, PPID: %d ] i'm Process 4\n", getpid(), getppid() );
     
    	kind5 = fork();
    	if(kind5 < 0)
    	{
    	  fprintf(stderr, "cannot fork, error %d\n", errno);
    	  exit(-5);      
    	}
    	if(kind5== 0)
    	{
    	  printf("[PID: %d, PPID: %d ] i'm Process 5\n", getpid(), getppid() );
    	  exit(52);
    	}
    	else if(kind5 > 0){
    	  printf("[PID: %d, PPID: %d ] i'm Process 4\n", getpid(), getppid() );
     
    	  kind6 = fork();
    	  if(kind6 < 0)
    	  {
    	    fprintf(stderr, "cannot fork, error %d\n", errno);
    	    exit(-6);      
    	  }
    	  if(kind6 == 0)
    	  {
    	    printf("[PID: %d, PPID: %d ] i'm Process 6\n", getpid(), getppid() );
    	    exit(62);
    	  }
     
    	}
     
    	exit(42);
          }
          exit(1);
        }
     
        return 0;
    }

    En fait il fonctionne bien !! mais lorsque je compile je me rends compte qu'a partir du 3eme Processus, le parent PID est faux...Nom : shell.png
Affichages : 82
Taille : 4,3 Ko

    Qu'est je fais de travers dans mon code??

    Parce que normalement le resultat devrais etre de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [PID: 3626, PPID: 3620 ] i'm Process 1
    [PID: 3627, PPID: 3626 ] i'm Process 2
    [PID: 3628, PPID: 3627 ] i'm Process 3
    [PID: 3629, PPID: 3626 ] i'm Process 4
    [PID: 3630, PPID: 3629 ] i'm Process 5
    [PID: 3631, PPID: 3629 ] i'm Process 6
    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Je n'ai fait que survoler ton post mais, à première vue, le processus père prend fin avant que les fils ne reçoivent leur quantum de temps d'exécution. Du coup, lorsqu'ils sont exécutés, le processus père est déjà mort et les fils ont été rattachés au processus init (1).

    Essaie d'insérer un sleep(3) avant chaque exit().

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Il y a un principe à ne jamais perdre de vue dans le fork, c'est que rien ne te garanti l'ordre des processus.
    Tu peux très bien avoir le père qui se déroule une partie de son code avant que le fils ne commence, ou l'inverse. Et si tu fais une hiérarchie à n processus, tu peux très bien avoir le fils 3 qui commence et se termine avant que le fils 4 ne commence. Et quand le fils 4 commence, s'il n'y a plus de 3 il est alors rattaché au init (pid=1)

    Un moyen simple de forcer l'ordonnancement des processus est de leur mettre un sleep(n) (n décroissant). C'est pas la panacée mais pour un simple test alors ça suffit.

    Ensuite, si vraiment tu veux faire un ordonnancement de qualité alors il faut bloquer les processus avec pause() et jouer ensuite du kill() et du signal()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ensuite, si vraiment tu veux faire un ordonnancement de qualité alors il faut bloquer les processus avec pause() et jouer ensuite du kill() et du signal()
    Ca me parait plus approprie!! j'essaye cela.

    Merci pour les reponses

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 3logy Voir le message
    Ca me parait plus approprie!! j'essaye cela.
    Euh, c'est quand-même un truc assez chiadé à mettre en place !!! Quand j'étais prof de de C-système, ce genre de TP n'arrivait qu'après avoir bien vu en détail le fonctionnement d'un fork, d'un kill, d'un signal, d'un pause... bref après plusieurs heures de cours et de tp quoi !!!

    Si c'est juste un tp de base, la solution sleep() est plus appropriée !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 25
    Dernier message: 22/01/2012, 15h08
  2. Linux gestion des processus
    Par nonix dans le forum Linux
    Réponses: 6
    Dernier message: 10/06/2010, 11h16
  3. Gestion des processus sous Linux
    Par progdevlop dans le forum C
    Réponses: 18
    Dernier message: 27/06/2009, 14h45
  4. je cherche des tutoriels sur la gestion des processus en C++, merci
    Par phenix1988 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 02/03/2009, 10h44
  5. [Système] gestion des processus linux
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 17/11/2006, 23h16

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