--- rpl/src/daemon.c 2011/06/22 13:26:57 1.25 +++ rpl/src/daemon.c 2024/01/17 16:57:09 1.83 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.3 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.36 + Copyright (C) 1989-2024 Dr. BERTRAND Joël This file is part of RPL/2. @@ -59,22 +59,8 @@ lancement_daemon(struct_processus *s_eta fflush(NULL); -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - pid = fork(); -# ifdef OS2 - if (pid == 0) - { - sem_init(&semaphore_liste_threads, 0, 1); - sem_init(&semaphore_gestionnaires_signaux, 0, 0); - sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); - sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); - } -# endif - if (pid < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -84,6 +70,21 @@ 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 SEMAPHORES_NOMMES + sem_post(&((*s_etat_processus).semaphore_fork)); + sem_destroy(&((*s_etat_processus).semaphore_fork)); +# else + sem_post((*s_etat_processus).semaphore_fork); + sem_destroy3((*s_etat_processus).semaphore_fork, getpid(), + pthread_self(), SEM_FORK); +# endif + + destruction_queue_signaux(s_etat_processus); _exit(EXIT_SUCCESS); } @@ -101,31 +102,12 @@ lancement_daemon(struct_processus *s_eta return; } - freopen("/dev/null", "r", stdin); - freopen("/dev/null", "w", stdout); - freopen("/dev/null", "w", stderr); - /* * Second fork pour ne plus être un session leader. */ - fflush(NULL); pid = fork(); -# ifdef _BROKEN_SIGINFO - creation_fifos_signaux(s_etat_processus); -# endif - -# ifdef OS2 - if (pid == 0) - { - sem_init(&semaphore_liste_threads, 0, 1); - sem_init(&semaphore_gestionnaires_signaux, 0, 0); - sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); - sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); - } -# endif - if (pid < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -138,7 +120,21 @@ lancement_daemon(struct_processus *s_eta _exit(EXIT_SUCCESS); } + fprintf(stdout, "%d\n", getpid()); + fflush(stdout); + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "w", stdout); + freopen("/dev/null", "w", stderr); +# pragma GCC diagnostic pop + + fflush(NULL); + (*s_etat_processus).pid_processus_pere = getpid(); + liberation_queue_signaux(s_etat_processus); + creation_queue_signaux(s_etat_processus); modification_pid_thread_pere(s_etat_processus); return;