--- rpl/src/interruptions.c 2016/03/21 12:08:05 1.172 +++ rpl/src/interruptions.c 2016/03/24 09:38:29 1.175 @@ -2786,6 +2786,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2794,6 +2795,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2804,7 +2807,6 @@ envoi_signal_processus(pid_t pid, enum s // Pendant de DosGetNamedSHaredMem() # endif # endif - return(1); } @@ -2815,6 +2817,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2823,6 +2826,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2847,14 +2852,17 @@ envoi_signal_processus(pid_t pid, enum s != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { close(segment); - return(1); - } + return(1); + } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2884,6 +2892,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2892,6 +2901,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2914,6 +2925,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2922,6 +2934,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2943,6 +2957,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2951,6 +2966,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2972,6 +2989,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2980,6 +2998,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2998,6 +3018,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -3008,7 +3029,6 @@ envoi_signal_processus(pid_t pid, enum s } close(segment); - # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -3144,12 +3164,33 @@ creation_queue_signaux(struct_processus return; } - if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT /* | O_EXCL*/, + 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)