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 sous Linux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Par défaut Gestion des processus sous Linux
    Bonjour
    J'ai écris un programme qui permet de créer un processus fils, d'afficher le PID et l'état de chaqun des deux processus (le père et le fils), seulement le processus fils va faire une tâche : il va appeler (ou executer) un autre programme que j'ai écris.
    Le problème : après la compilation du premier programme j'ai eu les erreurs suivantes :

    processu.c: In function ‘main’:
    processu.c:29: warning: missing sentinel in function call
    Si quelqu'un peut m'aider pour résoudre ce problème ?
    Merci d'avance.

    Voici le code source des deux programmes :

    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
     
     /*------code source de processus.c:-------*/
     
     #include<unistd.h>
     #include<stdio.h>
     #include<stdlib.h>
     int fils,pidfils,iden;
     char etat1[1024];
     char etat2[1024];
     main()
     {
     int pid_p;
     pid_p=getpid();
     printf("pere: je suis le processus pere mon pid=%d\n",getpid());
     sleep(1);
     sprintf(etat1,"ps -o s -p%d",pid_p);
     system(etat1);
     iden=fork();
     if(iden==-1)
     {
     printf("erreur de creation de processus fils\n");
     exit(1);
     }
     if(iden==0)
     {
     int pid_f;
     pid_f=getpid();
     printf("\nfils: je suis le processus fils mon pid=%d\n\n",pid_f);
     sprintf(etat2,"ps -o s -p%d",pid_f);
     system(etat2);
     sleep(1);
     execl("prog","prog",0);
     }
     else
     {
     printf("\npere: maintenant je dors 5 secondes\n");
     sleep(5);
     printf("pere: je suis reveille\n\n");
     pidfils=wait(&fils);
     printf("pere: mon processus fils termine son execution et son pidfils=%d\n\n",pidfils);
     }
     }
     
     /*-----------code source de prog.c-----------*/
     #include<sys/types.h>
     #include<sys/wait.h>
     
     main()
     {
     printf("\n\t*************PROGRAMME EXECUTE PAR LE FILS******************\n");
     printf("\nle programme: je suis le programme executer par le fils\n");
     printf("\nle programme: l'identificateur de mon pere ppid=%d\n",getppid());
     printf("\nle programme: le fils va vous donnez la date d'haujourd'huit\n");
     printf("\nle programme:\t");
     execlp("/usr/bin/date","/usr/bin/date",NULL);
     }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    La ligne 29, ne serait-ce pas celle de l'appel à execl() ?

    Si je peux me fier à cette doc, il est possible que le zéro doive être explicitement casté en char*.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    LE dernier paramètre de execl doit NULL.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 448
    Par défaut
    J'ajoute, pour compléter la réponse de publicStaticVoidMain, qu'une sentinelle est une valeur balise que l'on place à la fin d'une suite de données, précisément pour détecter cette fin le moment venu sans que l'on ait à tenir un compteur à jour pour le savoir.

    À noter également que execl est une fonction variadique et que le type des paramètres n'est pas défini par défaut. Le compilateur peut reconnaître le paramètre passé sur la forme et générer un avertissement mais, dans tous les cas, comme je n'ai jamais travaillé sur des plate-formes qui définissaient NULL autrement qu'avec un zéro, ça devrait fonctionner quand même malgé le warning. Ce n'est bien sûr pas une raison pour le laisser en l'état. :-)

  5. #5
    Membre Expert 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
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    comme je n'ai jamais travaillé sur des plate-formes qui définissaient NULL autrement qu'avec un zéro,
    moi c'est le contraire, pour le moment, toutes les plateformes sur lesquelles j'ai bossé définissait NULL correctement (== qui fonctionne dans tous les cas) à savoir:

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Du moins, en C. Quand on passe au C++, c'est une autre histoire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 448
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    moi c'est le contraire, pour le moment, toutes les plateformes sur lesquelles j'ai bossé définissait NULL correctement (== qui fonctionne dans tous les cas) à savoir:
    C'est ce que je voulais dire. La valeur numérique est un zéro. Une fois compilée, c'est bien cette valeur que l'on retrouve chargée dans le code assembleur.

  8. #8
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    J'ajoute, pour compléter la réponse de publicStaticVoidMain, qu'une sentinelle est une valeur balise que l'on place à la fin d'une suite de données, précisément pour détecter cette fin le moment venu sans que l'on ait à tenir un compteur à jour pour le savoir.

    À noter également que execl est une fonction variadique et que le type des paramètres n'est pas défini par défaut. Le compilateur peut reconnaître le paramètre passé sur la forme et générer un avertissement mais, dans tous les cas, comme je n'ai jamais travaillé sur des plate-formes qui définissaient NULL autrement qu'avec un zéro, ça devrait fonctionner quand même malgé le warning. Ce n'est bien sûr pas une raison pour le laisser en l'état. :-)

    Justement il s'execute normalement malgé le warning mais ce même problème s'est affiché dans un autre programme que j'ai écris mais je n'est pas mis l'instruction execl() (l'execution du programme marche normalement), seulement je veux comprendre ces erreurs sont dû à quoi ?

  9. #9
    Membre Expert 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
    Par défaut
    Citation Envoyé par progdevlop Voir le message
    Justement il s'execute normalement malgé le warning mais ce même problème s'est affiché dans un autre programme que j'ai écris mais je n'est pas mis l'instruction execl() (l'execution du programme marche normalement), seulement je veux comprendre ces erreurs sont dû à quoi ?
    C'est fonction sont déclarés avec un attribut GCC particuliers nommé sentinel:
    Citation Envoyé par http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Function-Attributes.html#Function-Attributes
    sentinel
    This function attribute ensures that a parameter in a function call is an explicit NULL. The attribute is only valid on variadic functions. By default, the sentinel is located at position zero, the last parameter of the function call. If an optional integer position argument P is supplied to the attribute, the sentinel must be located at position P counting backwards from the end of the argument list.

    __attribute__ ((sentinel))
    is equivalent to
    __attribute__ ((sentinel(0)))


    The attribute is automatically set with a position of 0 for the built-in functions execl and execlp. The built-in function execle has the attribute set with a position of 1.

    A valid NULL in this context is defined as zero with any pointer type. If your system defines the NULL macro with an integer type then you need to add an explicit cast. GCC replaces stddef.h with a copy that redefines NULL appropriately.

    The warnings for missing or incorrect sentinels are enabled with -Wformat

Discussions similaires

  1. Gestion des Processus sur Linux
    Par 3logy dans le forum Débuter
    Réponses: 4
    Dernier message: 11/11/2010, 15h45
  2. Gestion des perfs sous linux
    Par yanis97 dans le forum Linux
    Réponses: 3
    Dernier message: 21/02/2009, 21h29
  3. Empiler et dépiler des processus sous Linux ? Comment gérer la pile ?
    Par Leschocolats dans le forum Administration système
    Réponses: 2
    Dernier message: 18/12/2008, 21h26
  4. Outils de gestion des fichiers sous Linux
    Par achmn dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 04/06/2008, 11h54
  5. gestion des quotas sous linux
    Par mrrenard dans le forum Administration système
    Réponses: 2
    Dernier message: 05/02/2008, 11h40

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