1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2017
    Messages : 2
    Points : 2
    Points
    2

    Par défaut Programmation C sur linux

    Bonjour

    je cherche la solution a cet exercice SVP! j'ai beau essayé mais sans résultat

    Merci Nom : Sans titre.png
Affichages : 68
Taille : 18,8 Ko

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    6 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 6 735
    Points : 14 114
    Points
    14 114

    Par défaut

    Nous ne ferons pas ton travail à ta place.

    Montres-nous ce que tu as fait et dis-nous ce que tu ne comprends pas et nous t'aiderons.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2017
    Messages : 2
    Points : 2
    Points
    2

    Par défaut

    Voici le programme !!!

    Code C : 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 <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
    #include <signal.h>
    #include <sys/wait.h>
     
    pid_t pid_fils;
    pid_t pid_pere;
    int i=0;
     
    void attenteUSR1(int sig){
            kill(pid_fils, 12);
            printf("Pere --> Fils : 12\n");
            sleep(2);
            kill(pid_fils, 12);
            printf("Pere --> Fils : 12\n");
    }
     
    void attenteUSR2(int sig){
            signal(SIGUSR2,SIG_DFL);
     
     
    }
     
    //-----------------------------------------------------------------Functions-----------------------------------------------------------------------
     
    pid_t nouveau_process(void)
    {
        pid_t pid;
            pid = fork();
        return pid;
    }
     
    void pere(pid_t pid_fils)
    {
     
            while(1){
                    signal(SIGUSR1, attenteUSR1);
            }
    }
     
    void fils(void)
    {
            printf("Fils --> Pere : 10\n");
            kill(getppid(), 10);
                   while(1){
                    signal(SIGUSR2, attenteUSR2);
            }
    }
     
    //-----------------------------------------------------------------Main---------------------------------------------------------------------------
     
    int main(void)
    {
        pid_t pid = nouveau_process();
            pid_fils=pid;
            printf("Pere main : %d\n",pid_pere);
            printf("Fils main : %d\n",pid_fils);
        switch (pid) {
            case -1:
                            return EXIT_FAILURE;
                            break;
                     case 0:
                            pid_fils=getpid();
                            printf("Pere fils : %d\n",pid_pere);
                            printf("Fils fils : %d\n",pid_fils);
                            fils();
                            break;
            default:
                    pid_pere=getpid();
                    printf("Pere pere : %d\n",pid_pere);
                            printf("Fils pere : %d\n",pid_fils);
                            pere(pid);
                            break;
        }
     
        return EXIT_SUCCESS

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    6 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 6 735
    Points : 14 114
    Points
    14 114

    Par défaut

    ligne 59, tu imprimes pid_pere alors que la variable n'est pas initialisée.

    D'après ton schéma, tu dois gérer les signaux, je ne vois aucune trace de cela.

    Regardes ça :
    http://mtodorovic.developpez.com/lin...e/?page=page_3
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    novembre 2010
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 100
    Points : 5 724
    Points
    5 724

    Par défaut

    salut,

    j'ajouterai que ton switch(pid) n'est peut-être pas une bonne idée, à la fin tu peux y perdre en lisibilité

    bon comme ça ça m'exerce, j'avais pas fait de C depuis longtemps :
    Code C : 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
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <sys/wait.h>
     
    #ifdef DEBUG
       #include <stdio.h>
       #define DBG(...)  fprintf(stderr, __VA_ARGS__)
    #else
       #define DBG(...)
    #endif
     
    pid_t pid;
    int sigcount = 0;
     
    void handleSignals (int sig) {
       sigcount++;
       DBG("%s : signal %s reçu\n", (pid)?"PERE":"FILS", (sig==SIGUSR1)?"SIGUSR1":"SIGUSR2");
    }
     
    int main (void) {
       pid = fork();
     
       if (pid < 0) {
          DBG("échec fork()\n, exiting.");
          return -1;
       }
     
       if (pid == 0) {
          /* on est dans le fils */
          DBG("FILS : je suis vivant !\n");
          signal(SIGUSR2, handleSignals);
          DBG("FILS : envoie du signal SIGUSR1 au processus père\n");
          kill(getppid(), SIGUSR1);
          while(sigcount < 2);
          DBG("FILS : les deux signaux ont été reçu, on quitte\n");
       } else {
          /* on est dans le père */
          DBG("PERE : présent !\n");
          signal(SIGUSR1, handleSignals);
          while(sigcount < 1);
          DBG("PERE : envoie du premier signal\n");
          kill(pid, SIGUSR2);
          DBG("PERE : on attend 1sec, le temps que le fils récupère le signal\n");
          sleep(1);
          DBG("PERE : envoie du second signal\n");
          kill(pid, SIGUSR2);
          DBG("PERE : en attente du fils pour quitter\n");
          wait(NULL);
          DBG("PERE : on quitte\n");
       }
       DBG("%s : fin normale du processus\n", (pid)?"PERE":"FILS");
       return 0;
    }

    c'est une façon parmi d'autres de faire, la plus simple

    et le résultat :
    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
    $ gcc -Wall -DDEBUG pouet.c -o pouet && ./pouet
    PERE : présent !
    FILS : je suis vivant !
    FILS : envoie du signal SIGUSR1 au processus père
    PERE : signal SIGUSR1 reçu
    PERE : envoie du premier signal
    PERE : on attend 1sec, le temps que le fils récupère le signal
    FILS : signal SIGUSR2 reçu
    PERE : envoie du second signal
    PERE : en attente du fils pour quitter
    FILS : signal SIGUSR2 reçu
    FILS : les deux signaux ont été reçu, on quitte
    FILS : fin normale du processus
    PERE : on quitte
    PERE : fin normale du processus
    Avant donc que d'écrire, apprenez à penser.
    Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
                                                        - Nicolas Boileau, L'Art poétique

Discussions similaires

  1. [GMP]Programme correct sur Linux, pas sur Windows
    Par FoX_*D i E* dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 22/01/2010, 17h26
  2. diffusion de mon programme sur linux et windows
    Par lex13 dans le forum Langage
    Réponses: 23
    Dernier message: 25/08/2007, 12h03
  3. Installation de nouveaux programme sur linux exp(Oracle)
    Par deutsch dans le forum Administration système
    Réponses: 2
    Dernier message: 02/12/2006, 14h14
  4. Programme windos sur linux
    Par kill95 dans le forum Applications et environnements graphiques
    Réponses: 7
    Dernier message: 21/05/2006, 16h55

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