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

Réseau C Discussion :

Programmation systeme en C et les signaux


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut Programmation systeme en C et les signaux
    Bonjour,

    Je dois creer un processus avec fork() et capter les signaux ainsi que les status.

    J'ai un petit programme pour essayer de comprendre le fonctionnement, mais ça ne fonctionne pas.

    Pouvez-vous me dire comment faire pour obtenir le status du processus ???

    Selon la documentation sur ce site, je devrais pouvoir obtenir le status:

    http://www.opengroup.org/onlinepubs/...ions/wait.html

    IF(WIFSIGNALED(status)).. devrait être exécuté selon moi, mais ce n'est pas le cas. Alors comment faire pour obtenir le status de terminaison du processus?

    Faites le test avec une interruption "ctrl_c" qui est supposer lancer le signal SIGINT. Ça ne fonctionne pas. wait retourne -1 et le status est 0.

    Merci de me donner vos commentaires



    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
     
    #include <fcntl.h>
    #include <sys/stat.h>
     
     
    int main(){
        pid_t child_pid, wpid;
        int status;
     
     
        child_pid = fork();
     
        if (child_pid == -1) {      /* fork() failed */
            perror("fork");
            exit(EXIT_FAILURE);
        }
     
     
        if (child_pid == 0) {       /* This is the child */   
     
            while(1);
     
        } else {                    /* This is the parent */
     
            wpid = wait(&status);
     
            if (wpid == -1) {
                perror("waitpid");
                printf("\n ***** La fonction wait() a retourné : %d  et le status est: %d ******\n\n",wpid, status);
                exit(EXIT_FAILURE);
            }
     
            if (WIFEXITED(status)) {
                printf("child exited, status=%d\n", WEXITSTATUS(status));
     
            } else if (WIFSIGNALED(status)) {
                printf("child killed (signal %d)\n", WTERMSIG(status));
     
            } else if (WIFSTOPPED(status)) {
                printf("child stopped (signal %d)\n", WSTOPSIG(status));
            }
        }
    }

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tu es sur quelle plateforme stp ?

    Si tu es sur Linux ou Unix, les signaux ne sont pas WIFEXITED ou ...

    Va voir les tutoriels C .....

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Par défaut
    bonjour,

    Pour attendre la fin d'un processus, on utilise les fonctions de la famille wait()

    pid_t wait(int * status) : renvoit le pid du fils terminé. si le pointeur status n'est pas NULL, on est renseigné sur les circonstances de terminaison du processus.

    le contenu de status est opaque, on doit donc faire appel à quelques macro pour s'informer des circonstances de trminaison

    la macro WIFEXITED(status) : renvoie vrai si le processus s'est terminé en invoquant exit(), ou en revenant de main.
    on récupère le code de retour avec WEXITSTATUS(status).

    bon courage

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut
    D'accord. Oui, je suis sou linux.

    J'étais au courant de ces macros. J'ai d'ailleurs voulu les tester. Je me suis rendu compte que le ctrl-c(SIGINT #2) ne fait pas la même chose que l'orsque l'on lance le signal avec kill -INT pid (#2). Alors j'essayais d'interrompre le programme avec ctrl-c et ça ne fonctionnait pas.

    Je ne comprends toujours pas pourquoi le ctrl-c n'envoie pas de signal comme le kill -INT pid, c'est pourtant le même signal.

    Anyway.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    non ça n'est pas le même signal...

    Ctrl-c c'est "à l'intérieur" du progamme, kill à l'extérieur...

    Signaux SIGQUIT et SIGKILL

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ce n'est pas plutôt SIGTERM ?
    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.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/11/2013, 20h40
  2. programmation avec les signaux sur le noyau linux
    Par kallelomar dans le forum Linux
    Réponses: 4
    Dernier message: 06/07/2012, 15h43
  3. un programme sur les signaux
    Par hindou90 dans le forum Réseau
    Réponses: 4
    Dernier message: 14/02/2011, 14h26
  4. [C#] Gérer les signaux genre ctrl+c?
    Par BleudeBromothymol dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/11/2004, 15h32
  5. [Kylix] Programmation systeme
    Par ddmicrolog dans le forum EDI
    Réponses: 1
    Dernier message: 23/01/2003, 13h36

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