version 1.70, 2011/09/15 19:23:54
|
version 1.71, 2011/09/15 19:30:38
|
Line 2347 nom_segment(unsigned char *chemin, pid_t
|
Line 2347 nom_segment(unsigned char *chemin, pid_t
|
} |
} |
|
|
|
|
|
/* |
|
================================================================================ |
|
Fonctions d'envoi d'un signal à un thread ou à un processus. |
|
================================================================================ |
|
Entrée : processus et signal |
|
-------------------------------------------------------------------------------- |
|
Sortie : erreur |
|
-------------------------------------------------------------------------------- |
|
Effet de bord : Néant |
|
================================================================================ |
|
*/ |
|
|
int |
int |
envoi_signal_processus(pid_t pid, enum signaux_rpl signal) |
envoi_signal_processus(pid_t pid, enum signaux_rpl signal) |
{ |
{ |
Line 2541 creation_queue_signaux(struct_processus
|
Line 2553 creation_queue_signaux(struct_processus
|
racine_segment = (*s_etat_processus).chemin_fichiers_temporaires; |
racine_segment = (*s_etat_processus).chemin_fichiers_temporaires; |
|
|
# ifndef IPCS_SYSV // POSIX |
# ifndef IPCS_SYSV // POSIX |
|
if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, |
|
getpid())) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, |
if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL, |
getpid())) == NULL) |
S_IRUSR | S_IWUSR)) == -1) |
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL, |
|
S_IRUSR | S_IWUSR)) == -1) |
|
{ |
|
free(nom); |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1) |
|
{ |
|
free(nom); |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux), |
|
PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0); |
|
|
|
if (((void *) s_queue_signaux) == ((void *) -1)) |
|
{ |
|
if (shm_unlink(nom) == -1) |
|
{ |
{ |
free(nom); |
free(nom); |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
return; |
return; |
} |
} |
|
|
free(nom); |
if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1) |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
{ |
return; |
free(nom); |
} |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
free(nom); |
} |
|
|
# ifndef SEMAPHORES_NOMMES |
|
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
|
# else |
|
(*s_queue_signaux).semaphore = sem_init2(0, sem_gestionnaires_signaux); |
|
|
|
if ((*s_queue_signaux).semaphore == SEM_FAILED) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
return; |
|
} |
|
# endif |
|
|
|
(*s_queue_signaux).pointeur_lecture = 0; |
|
(*s_queue_signaux).pointeur_ecriture = 0; |
|
|
|
if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0)) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
return; |
|
} |
|
|
|
# else // SystemV |
|
# ifndef OS2 |
|
|
|
file *desc; |
|
|
|
key_t clef; |
|
|
|
// Création d'un segment de données associé au PID du processus courant |
|
|
|
chemin = (*s_etat_processus).chemin_fichiers_temporaires; |
|
|
|
if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, |
|
getpid())) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
if ((desc = fopen(nom, "w")) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return; |
|
} |
|
|
|
fclose(desc); |
s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux), |
|
PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0); |
|
|
if ((clef = ftok(nom, 1)) == -1) |
if (((void *) s_queue_signaux) == ((void *) -1)) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
if (shm_unlink(nom) == -1) |
return; |
{ |
} |
free(nom); |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
free(nom); |
free(nom); |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
if ((segment = shmget(clef, |
free(nom); |
nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int), |
# ifndef SEMAPHORES_NOMMES |
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1) |
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
{ |
# else |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_queue_signaux).semaphore = sem_init2(0, |
return; |
sem_gestionnaires_signaux); |
} |
|
|
if ((*s_queue_signaux).semaphore == SEM_FAILED) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
return; |
|
} |
|
# endif |
|
|
fifos = shmat(segment, NULL, 0); |
(*s_queue_signaux).pointeur_lecture = 0; |
|
(*s_queue_signaux).pointeur_ecriture = 0; |
|
|
if (((void *) fifos) == ((void *) -1)) |
if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0)) |
{ |
|
if (shmctl(segment, IPC_RMID, 0) == -1) |
|
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_etat_processus).erreur_systeme = d_es_processus; |
return; |
return; |
} |
} |
|
# else // SystemV |
|
# ifndef OS2 |
|
file *desc; |
|
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
key_t clef; |
return; |
|
} |
|
|
|
# else |
// Création d'un segment de données associé au PID du processus |
|
// courant |
|
|
if ((nom = nom_segment(NULL, getpid())) == NULL) |
chemin = (*s_etat_processus).chemin_fichiers_temporaires; |
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues * |
if ((nom = nom_segment((*s_etat_processus) |
((2 * longueur_queue) + 4) * sizeof(int), |
.chemin_fichiers_temporaires, getpid())) == NULL) |
PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
free(nom); |
return; |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
} |
return; |
|
} |
if ((desc = fopen(nom, "w")) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return; |
|
} |
|
|
|
fclose(desc); |
|
|
|
if ((clef = ftok(nom, 1)) == -1) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
free(nom); |
free(nom); |
fifos = ptr_os2; |
|
|
|
# endif |
if ((segment = shmget(clef, |
|
nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int), |
|
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
fifos = shmat(segment, NULL, 0); |
|
|
|
if (((void *) fifos) == ((void *) -1)) |
|
{ |
|
if (shmctl(segment, IPC_RMID, 0) == -1) |
|
{ |
|
(*s_etat_processus).erreur_systeme = |
|
d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
# else // OS/2 |
|
if ((nom = nom_segment(NULL, getpid())) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues * |
|
((2 * longueur_queue) + 4) * sizeof(int), |
|
PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) |
|
{ |
|
free(nom); |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
free(nom); |
|
fifos = ptr_os2; |
|
# endif |
# endif |
# endif |
|
|
return; |
return; |
Line 2708 liberation_queue_signaux(struct_processu
|
Line 2716 liberation_queue_signaux(struct_processu
|
# else // OS/2 |
# else // OS/2 |
# endif |
# endif |
# else // POSIX |
# else // POSIX |
|
|
sem_close(&((*s_queue_signaux).semaphore)); |
sem_close(&((*s_queue_signaux).semaphore)); |
|
|
if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) |
if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) |
Line 2743 destruction_queue_signaux(struct_process
|
Line 2750 destruction_queue_signaux(struct_process
|
unsigned char *nom; |
unsigned char *nom; |
|
|
# ifdef IPCS_SYSV // SystemV |
# ifdef IPCS_SYSV // SystemV |
# ifndef OS2 |
# ifndef OS2 |
|
if (shmdt(fifos) == -1) |
if (shmdt(fifos) == -1) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
return; |
return; |
} |
} |
|
|
if (shmctl(segment, IPC_RMID, 0) == -1) |
if (shmctl(segment, IPC_RMID, 0) == -1) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
return; |
return; |
} |
} |
|
|
if ((nom = nom_segment((*s_etat_processus) |
if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, |
.chemin_fichiers_temporaires, getpid())) == NULL) |
getpid())) == NULL) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
return; |
return; |
} |
} |
|
|
|
// FERMER LE FICHIER |
|
|
|
unlink(nom); |
|
free(nom); |
|
|
|
# else |
// FERMER LE FICHIER |
|
|
if (DosFreeMem(fifos) != 0) |
unlink(nom); |
{ |
free(nom); |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
# else |
return; |
if (DosFreeMem(fifos) != 0) |
} |
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
// FERMER LE FICHIER |
// FERMER LE FICHIER |
|
|
# endif |
# endif |
# else // POSIX |
# else // POSIX |
sem_close(&((*s_queue_signaux).semaphore)); |
sem_close(&((*s_queue_signaux).semaphore)); |
sem_destroy(&((*s_queue_signaux).semaphore)); |
sem_destroy(&((*s_queue_signaux).semaphore)); |