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

Linux Discussion :

Comment lancer le fils après le père ( fork () )


Sujet :

Linux

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    mai 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mai 2011
    Messages : 250
    Points : 148
    Points
    148
    Par défaut Comment lancer le fils après le père ( fork () )
    Bonjour ,

    Je me lance dans la programmation système.

    Cependant, pour mon cas, il faudrait que le fils d'un fork s'exècute APRES que le père soit presque terminé,
    ou bien que celui-ci attende l'exécution du fils après que le père ait déroulé une bonne partie de son code.

    En effet, je lance une commande système qui sera exécuter par le fils, mais construite par le père.

    Un exemple valant mieux qu'un long discours, voici le code :

    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
    80
    81
    82
    83
    /* Pour les constantes EXIT_SUCCESS et EXIT_FAILURE */
    #include <stdlib.h>
    /* Pour fprintf() */
    #include <stdio.h>
    /* Pour fork() */
    #include <unistd.h>
    /* Pour perror() et errno */
    #include <errno.h>
    /* Pour le type pid_t */
    #include <sys/types.h>
    /* Pour wait() */
    #include <sys/wait.h>
     
    /* La fonction create_process duplique le processus appelant et retourne
       le PID du processus fils ainsi créé */
    pid_t create_process(void)
    {
        /* On crée une nouvelle valeur de type pid_t */
        pid_t pid;
     
        /* On fork() tant que l'erreur est EAGAIN */
        do {
            pid = fork();
        } while ((pid == -1) && (errno == EAGAIN));
     
        /* On retourne le PID du processus ainsi créé */
        return pid;
    }
     
    /* La fonction child_process effectue les actions du processus fils */
    void child_process(int flag)
    {
            printf("%s %i\n","flag =",flag);
            if (flag) printf ("%s","Exécution du fils\n");
    }
     
    /* La fonction father_process effectue les actions du processus père */
    int father_process(int child_pid,int flag)
    {
        printf("%s","Exécution du père\n");
        flag = 1;
     
     
        if (wait(NULL) == -1) 
        {
            perror("wait :");
            exit(EXIT_FAILURE);
        }
        return flag;
    }
     
    int main(void)
    {
     
     
        int flag = 0;
     
        pid_t pid = create_process();
     
        switch (pid) 
        {
            /* Si on a une erreur irrémédiable (ENOMEM dans notre cas) */
        case -1:
            perror("fork");
            return EXIT_FAILURE;
            break;
            /* Si on est dans le fils */
        case 0:
            {
            child_process(flag);
            break;
            }
            /* Si on est dans le père */
        default:
            {
            flag = father_process(pid,0);
            printf ("%s %i\n", "flag = ",flag);
            break;
            }
        }
     
        return EXIT_SUCCESS;
    }

    L'idée est que le père mette le flag à 1 pour autoriser l'exécution du fils.

    Mais ce code ne marche pas.

    De l'aide s.v.p

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    26 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 26 255
    Points : 209 345
    Points
    209 345
    Billets dans le blog
    91
    Par défaut
    Bonjour,

    La solution "simple", c'est de faire le fork, uniquement lorsque la commande est prête, du coup, pas besoin de synchronisation.
    Mais si la question est liée à un exercice quelconque, alors il faudra une communication inter processus. Dans le cas des forks (donc de processus distinct), il faut utiliser un socket (sur localhost), une message queue, ou un segment de mémoire partagé (mmap) (ou un fichier, mais les autres solutions sont plus propres).

    Pourquoi cela ne fonctionne pas avec une variable : car le fork créé un nouveau processus (merci captain obvious), mais le nouveau processus ne partage pas sa mémoire avec l'ancien. Au moment du fork, la mémoire du processus père est complètement dupliquée pour le fils, faisant que si des changements dans la mémoire du processus arrive après, alors elles ne sont répercutées chez le fils (et inversement, les modifications dans la mémoire du fils ne sont pas répercutées chez le père). Par contre, avec les threads (aussi appelés processus légers), la mémoire est partagée et l'utilisation d'une variable aurait pu permettre d'arriver à votre objectif.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    juillet 2020
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : juillet 2020
    Messages : 309
    Points : 1 150
    Points
    1 150
    Par défaut
    Du coup pourquoi faire un fork si on doit attendre la fin du père pour lancer le fils ? c'est séquentiel.
    Ou alors, dans le code du père ne faire le fork que lorsqu'il est prêt et pas au début …
    J'imagine qu'on est pas loin d'un problème XY.

    Du coup une phrase comme :
    Citation Envoyé par frederic13870 Voir le message
    [...]
    En effet, je lance une commande système qui sera exécuter par le fils, mais construite par le père.
    [...]
    Me fait me demander : pour quoi le fork n'est-il pas effectué une fois la commande construite ?

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    mai 2004
    Messages
    10 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : mai 2004
    Messages : 10 068
    Points : 27 681
    Points
    27 681
    Par défaut
    Bonjour,

    Citation Envoyé par frederic13870 Voir le message
    il faudrait que le fils d'un fork s'exècute APRES que le père soit presque terminé
    Soit je n'ai pas compris, soit c'est conceptuellement bancal : comment le fork pourrait être fait alors que le père est terminé ?

    ou bien que celui-ci attende l'exécution du fils après que le père ait déroulé une bonne partie de son code.
    Pourquoi faire le fork puis attendre ? Il suffit que ton appel à fork soit fait juste avant que le père ne meurt, et hop tu as résolu ton problème, non ?

    je lance une commande système qui sera exécuter par le fils, mais construite par le père.
    Justement, lance le fils lorsque la commande est prête !
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/10/2017, 11h58
  2. Comment lancer une Schédule après une autre schédule ?
    Par remi.c dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 02/11/2011, 18h32
  3. Comment lancer une procédure après affichage d'une form
    Par Fouinard dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 29/10/2008, 09h52
  4. instancier un objet fils, d'après objet père
    Par Bindy dans le forum Langage
    Réponses: 9
    Dernier message: 08/06/2007, 10h57
  5. Réponses: 4
    Dernier message: 06/01/2007, 21h42

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