Annotation of rpl/src/daemon.c, revision 1.19
1.1 bertrand 1: /*
2: ================================================================================
1.19 ! bertrand 3: RPL/2 (R) version 4.0.21
1.18 bertrand 4: Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1 bertrand 5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.12 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Fonction de bascule vers un mode de fonctionnement de daemon
29: ================================================================================
30: Entrées : pointeur sur une structure
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: lancement_daemon(struct_processus *s_etat_processus)
40: {
41: pid_t pid;
42: pid_t sid;
43:
44: /*
45: * Si le processus en cours est déjà un daemon (dont le père est init),
46: * on ne fait rien.
47: */
48:
1.7 bertrand 49: if (getppid() == (pid_t) 1)
1.1 bertrand 50: {
51: return;
52: }
53:
54: /*
55: * Premier fork pour lancer un setsid(). Le fork() n'est pas protégé par
56: * un mutex car on ne peut transformer en daemon que le processus de
57: * lancement du RPL/2.
58: */
59:
60: fflush(NULL);
1.15 bertrand 61:
62: # ifdef _BROKEN_SIGINFO
63: destruction_fifos_signaux(s_etat_processus);
64: # endif
65:
1.1 bertrand 66: pid = fork();
67:
1.14 bertrand 68: # ifdef OS2
69: if (pid == 0)
70: {
71: sem_init(&semaphore_liste_threads, 0, 1);
72: sem_init(&semaphore_gestionnaires_signaux, 0, 0);
73: sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
74: sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
75: }
76: # endif
77:
1.1 bertrand 78: if (pid < 0)
79: {
80: (*s_etat_processus).erreur_systeme = d_es_processus;
81: return;
82: }
83:
84: if (pid > 0)
85: {
86: // Fin du processus père.
87: _exit(EXIT_SUCCESS);
88: }
89:
90: sid = setsid();
91:
92: if (sid < 0)
93: {
94: (*s_etat_processus).erreur_systeme = d_es_processus;
95: return;
96: }
97:
98: if ((chdir((*s_etat_processus).chemin_fichiers_temporaires)) < 0)
99: {
100: (*s_etat_processus).erreur_systeme = d_es_processus;
101: return;
102: }
103:
104: freopen("/dev/null", "r", stdin);
105: freopen("/dev/null", "w", stdout);
106: freopen("/dev/null", "w", stderr);
107:
108: /*
109: * Second fork pour ne plus être un session leader.
110: */
111:
112: fflush(NULL);
113: pid = fork();
114:
1.15 bertrand 115: # ifdef _BROKEN_SIGINFO
116: creation_fifos_signaux(s_etat_processus);
117: # endif
118:
1.14 bertrand 119: # ifdef OS2
120: if (pid == 0)
121: {
122: sem_init(&semaphore_liste_threads, 0, 1);
123: sem_init(&semaphore_gestionnaires_signaux, 0, 0);
124: sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
125: sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
126: }
127: # endif
128:
1.1 bertrand 129: if (pid < 0)
130: {
131: (*s_etat_processus).erreur_systeme = d_es_processus;
132: return;
133: }
134:
135: if (pid > 0)
136: {
137: // Fin du processus père.
138: _exit(EXIT_SUCCESS);
139: }
140:
141: (*s_etat_processus).pid_processus_pere = getpid();
142: modification_pid_thread_pere(s_etat_processus);
143:
144: return;
145: }
146:
147: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>