--- rpl/src/interruptions.c 2016/03/17 16:31:36 1.170 +++ rpl/src/interruptions.c 2016/03/22 17:12:44 1.174 @@ -2780,7 +2780,6 @@ envoi_signal_processus(pid_t pid, enum s // À ce moment, le segment de mémoire partagée est projeté // dans l'espace du processus. - if ((semaphore = sem_open2(pid, SEM_QUEUE)) == SEM_FAILED) { # ifndef IPCS_SYSV // POSIX @@ -3007,6 +3006,9 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); + # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -3145,9 +3147,30 @@ creation_queue_signaux(struct_processus if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) { - sys_free(nom); - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; + if (errno != EEXIST) + { + sys_free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Attention : Le segment de mémoire %s préexiste !\n", + nom); + } + else + { + printf("+++Warning: %s memory segment preexists!\n", nom); + } + + if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR)) == -1) + { + sys_free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } } if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1) @@ -3379,6 +3402,12 @@ creation_queue_signaux(struct_processus } # endif + if (lancement_thread_signaux(s_etat_processus) == d_erreur) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + return; }