Explications sur les fonctions sémaphores
semget : int semget(key_t key, int nsems, int semflg) - Crée un ensemble de sémaphores. Exemple : semid = semget(IPC_PRIVATE, 4, 0666) crée un ensemble de 4 sémaphores accessibles en lecture/écriture par tous les processus.
semctl : int semctl(int semid, int semnum, int cmd, semun arg) - Permet de réaliser des opérations de contrôle sur l'ensemble de sémaphores identifié par semid (initialisation, destruction, etc.).
semop : int semop(int semid, struct sembuf *sops, size_t nsops) - Effectue des opérations sur un ensemble de sémaphores (les opérations P() et V()).
Exemple de code corrigé
#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/stat.h>#include <stdio.h>#include <stdlib.h>int main(){int f_vers_p, p_vers_f;int pid;int i;/* Définition des opérations sur les sémaphores */struct sembuf operation_P = {0, -1, 0};struct sembuf operation_V = {0, 1, 0};/* Création des sémaphores pour la synchronisation */f_vers_p = semget(IPC_PRIVATE, 1, 0666);if (f_vers_p == 0){fprintf(stderr, "Erreur lors de l'appel à semget() pour f_vers_p.\n");exit(-1);}semctl(f_vers_p, 0, SETVAL, 1); /* Initialisation de f_vers_p à 1 */p_vers_f = semget(IPC_PRIVATE, 1, 0666);if (p_vers_f == 0){fprintf(stderr, "Erreur lors de l'appel à semget() pour p_vers_f.\n");exit(-1);}semctl(p_vers_f, 0, SETVAL, 0); /* Initialisation de p_vers_f à 0 *//* Création du processus fils */pid = fork();if (pid == 0){/* Processus fils : affiche les lettres minuscules */for (i = 97; i <= 122; i++){semop(p_vers_f, &operation_P, 1); /* P(p_vers_f) */printf("%c\n", i);semop(f_vers_p, &operation_V, 1); /* V(f_vers_p) */}}else{/* Processus père : affiche les lettres majuscules */for (i = 65; i <= 90; i++){semop(f_vers_p, &operation_P, 1); /* P(f_vers_p) */printf("%c\n", i);semop(p_vers_f, &operation_V, 1); /* V(p_vers_f) */}}/* Destruction des sémaphores */semctl(p_vers_f, 0, IPC_RMID, 0);semctl(f_vers_p, 0, IPC_RMID, 0);return 0;}Questions fréquentes (FAQ)
1. Que font les opérations P() et V() dans ce code ?
Les opérations P() (semop avec -1) et V() (semop avec 1) permettent de synchroniser l'exécution des processus. P() décrémente le sémaphore et bloque le processus si la valeur est nulle, tandis que V() l'incrémente et réveille un processus bloqué.
2. Pourquoi initialiser le sémaphore p_vers_f à 0 ?
Le sémaphore p_vers_f est initialisé à 0 pour bloquer le processus fils dès le début, forçant ainsi le processus père à commencer l'exécution en premier. Cela permet une synchronisation correcte entre les deux processus.
3. Quelles sont les valeurs des caractères affichés ?
Le processus père affiche les lettres majuscules de A (65) à Z (90). Le processus fils affiche les lettres minuscules de a (97) à z (122). Les valeurs ASCII sont utilisées pour représenter les caractères.