• [^] # Re: Tu n'es pas le centre du monde

    Posté par . En réponse au journal Archlinux est morte.... Évalué à 1. Dernière modification le 11 octobre 2012 à 16:46.

    Avec des remarques comme ca on serait tous en train de coder en assembleur …

    Je te parle de conception logiciel tu me parles langage et implémentation… pas tout à fait la même chose.

    Pour illustrer mon propos, je me suis fendu d’une implémentation simple de la bonne façon de faire à mes yeux. Qui ne me semble pas très compliquée.

    main.c :

    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    void demon()
     {
     sleep(60);
     }
    void fils()
     {
     pid_t l_pid;
     printf("Debut du fils\n");
     /* Initialisation */
     /* Bricolage */
     printf("Debut du bricolage\n");
     sleep(10);
     printf("Fin du bricolage\n");
     /* Pret */
     printf("Fils %d\n",getpid());
     l_pid = setsid(); /* A partir de la, le process n'est plus associe a un terminal */
     printf("setsid() = %d\n",l_pid); /* Les printf fonctionnent puisque herite du premier fork */
     sleep(10);
     printf("Enfin pret.\n");
     /* Ferme les flux standard */
     close(0);
     close(1);
     close(2);
     l_pid = fork();
     switch (l_pid)
     {
     case -1:
     /* Soyons bourrin */
     exit(1);
     case 0:
     demon();
     exit(0);
     default:
     /* Synchronise le pere */
     exit(0);
     }
     }
    void pere(pid_t p_pid)
     {
     /* Attente du fils */
     printf("Attente du fils\n");
     wait(p_pid);
     printf("Fin de l'attente\n");
     }
    int main()
     {
     pid_t l_pid;
     l_pid = fork();
     switch (l_pid)
     {
     case -1:
     printf("Fork fail\n");
     return 1;
     case 0:
     fils();
     printf("Fin du deamon\n");
     return 0;
     default:
     pere(l_pid);
     }
     printf("Fils en demon\n");
     return 0;
     }
    
    

    On va utiliser 2 terminaux. Un avec un watch, et l’autre pour avec la commande lancée et la compilation.

    Dans le terminal 1, on compile :

    $ gcc main.c -o dem
    $ 
    
    

    Sur le 2 on surveille les processus :

    $ watch "(ps -u user | grep dem)"
    
    

    On démarre le démon sur le terminal 1 :

    $ ./dem
    Debut du fils
    Debut du bricolage
    Attente du fils
    
    

    Pendant ce temps sur le terminal 2 :

     5597 pts/7 00:00:00 dem
     5598 pts/7 00:00:00 dem
    
    

    Au bout de 10s :
    Term 1

    $ ./dem
    Debut du fils
    Debut du bricolage
    Attente du fils
    Fin du bricolage
    Fils 5598
    setsid() = 5598
    
    

    Term 2

     5597 pts/7 00:00:00 dem
     5598 ? 00:00:00 dem
    
    

    Enfin, la dernière étape :
    Term 1

    $ ./dem
    Debut du fils
    Debut du bricolage
    Attente du fils
    Fin du bricolage
    Fils 5598
    setsid() = 5598
    Enfin pret.
    Fin de l'attente
    Fils en demon
    $ 
    
    

    Term 2

    5661 ? 00:00:00 dem
    
    

    Pour résumer, on a un fork, le père attend sont fils. Le fils créé son groupe de session setsid, puis fork. Le nouveau fils est détaché, il ne se terminera pas avec son père. Le premier fils se termine, rendant la main au père initial. On voit ici, que si l’initialisation est faite au bricolage, le dernier fils héritant du contexte de son père. On peut rendre la main quand on a fini de s’initialiser, d’ouvrir ses socket

    Édition: correction mise en page.