1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.18
4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
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:
23: #include "rpl-conv.h"
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:
49: if (getppid() == (pid_t) 1)
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);
61: pid = fork();
62:
63: # ifdef OS2
64: if (pid == 0)
65: {
66: sem_init(&semaphore_liste_threads, 0, 1);
67: sem_init(&semaphore_gestionnaires_signaux, 0, 0);
68: sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
69: sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
70: }
71: # endif
72:
73: if (pid < 0)
74: {
75: (*s_etat_processus).erreur_systeme = d_es_processus;
76: return;
77: }
78:
79: if (pid > 0)
80: {
81: // Fin du processus père.
82: _exit(EXIT_SUCCESS);
83: }
84:
85: sid = setsid();
86:
87: if (sid < 0)
88: {
89: (*s_etat_processus).erreur_systeme = d_es_processus;
90: return;
91: }
92:
93: if ((chdir((*s_etat_processus).chemin_fichiers_temporaires)) < 0)
94: {
95: (*s_etat_processus).erreur_systeme = d_es_processus;
96: return;
97: }
98:
99: freopen("/dev/null", "r", stdin);
100: freopen("/dev/null", "w", stdout);
101: freopen("/dev/null", "w", stderr);
102:
103: /*
104: * Second fork pour ne plus être un session leader.
105: */
106:
107: fflush(NULL);
108: pid = fork();
109:
110: # ifdef OS2
111: if (pid == 0)
112: {
113: sem_init(&semaphore_liste_threads, 0, 1);
114: sem_init(&semaphore_gestionnaires_signaux, 0, 0);
115: sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
116: sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
117: }
118: # endif
119:
120: if (pid < 0)
121: {
122: (*s_etat_processus).erreur_systeme = d_es_processus;
123: return;
124: }
125:
126: if (pid > 0)
127: {
128: // Fin du processus père.
129: _exit(EXIT_SUCCESS);
130: }
131:
132: (*s_etat_processus).pid_processus_pere = getpid();
133: modification_pid_thread_pere(s_etat_processus);
134:
135: return;
136: }
137:
138: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>