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>voiddemon(){sleep(60);}voidfils(){pid_tl_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);case0:
demon();exit(0);default:/* Synchronise le pere */exit(0);}}voidpere(pid_tp_pid){/* Attente du fils */printf("Attente du fils\n");wait(p_pid);printf("Fin de l'attente\n");}intmain(){pid_tl_pid;l_pid=fork();switch(l_pid){case-1:
printf("Fork fail\n");return1;case0:
fils();printf("Fin du deamon\n");return0;default:pere(l_pid);}printf("Fils en demon\n");return0;}
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…
[^] # Re: Tu n'es pas le centre du monde
Posté par Anthony Jaguenaud . En réponse au journal Archlinux est morte.... Évalué à 1. Dernière modification le 11 octobre 2012 à 16:46.
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 :
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 :
Sur le 2 on surveille les processus :
On démarre le démon sur le terminal 1 :
Pendant ce temps sur le terminal 2 :
Au bout de 10s :
Term 1
Term 2
Enfin, la dernière étape :
Term 1
Term 2
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 sessocket…Édition: correction mise en page.