Annotation of rpl/src/daemon.c, revision 1.14
1.1 bertrand 1: /*
2: ================================================================================
1.11 bertrand 3: RPL/2 (R) version 4.0.18
1.1 bertrand 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:
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);
61: pid = fork();
62:
1.14 ! bertrand 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:
1.1 bertrand 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:
1.14 ! bertrand 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:
1.1 bertrand 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>