--- rpl/src/daemon.c 2011/09/20 14:36:28 1.33 +++ rpl/src/daemon.c 2011/09/21 09:09:22 1.34 @@ -70,6 +70,26 @@ lancement_daemon(struct_processus *s_eta if (pid > 0) { // Fin du processus père. + + // À noter : dans le cas où l'on utilise l'émulation des + // sémaphores anonymes POSIX ou la sémantique SysV, il faut + // détruire les sémaphores et les recréer dans le processus fils. + +# ifndef SEMAPHORE_NOMMES + sem_post(&((*s_etat_processus).semaphore_fork)); + sem_destroy(&((*s_etat_processus).semaphore_fork)); + + sem_post(&semaphore_gestionnaires_signaux); + sem_destroy(&semaphore_gestionnaires_signaux); +# else + sem_post((*s_etat_processus).semaphore_fork); + sem_destroy3((*s_etat_processus).semaphore_fork, getpid(), + pthread_self(), SEM_FORK); + + sem_post(semaphore_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux, getpid(), SEM_SIGNAUX); +# endif + destruction_queue_signaux(s_etat_processus); _exit(EXIT_SUCCESS); } @@ -115,6 +135,25 @@ lancement_daemon(struct_processus *s_eta creation_queue_signaux(s_etat_processus); modification_pid_thread_pere(s_etat_processus); +# ifndef SEMAPHORES_NOMMES + sem_init(&semaphore_gestionnaires_signaux, 0, 0); + sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); +# else + if ((semaphore_gestionnaires_signaux = sem_init2(0, getpid(), SEM_SIGNAUX)) + == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if ((sem_init(&((*s_etat_processus).semaphore_fork), 0, 0)) + == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } +# endif + return; }