Вы находитесь на странице: 1из 4

2 ING

Année Universitaire : 2018-2019

________________________________________________________

TRAVAUX PRATIQUES N°2


Programmation Système sous Unix
Synthèse sur les IPCs
____________________________________________________

Enseignante : Mme G.e.m. ZHIOUA

Sémaphore Mémoire Partagée Files de messages


Inclusions de librairies: Inclusions de librairies: Inclusions de librairies:

#include <sys/sem.h> #include <sys/shm.h> #include <sys/msg.h>


#include <sys/types.h> #include <sys/types.h> #include <sys/types.h>
#include <sys/ipc.h> #include <sys/ipc.h> #include <sys/ipc.h>
Création d'un groupe de Création d'une mémoire partagée: Création d'une file de messages:
sémaphores:
int shmget(int cle, int int msgget(int cle, int
int semget(int cle, int taille, int flg); flg);
nsems, int flg);

Ces appels renvoient l'identifiant de la ressource IPC créée ou 1 en cas d'erreur.

Les arguments de ces appels sont:


 cle est l’identificateur (entier) de la ressource IPC; ses valeurs possibles sont:
o IPC_PRIVATE : la ressource créé n'est alors pas lié à une clé d'accès, et seul le processus
propriétaire (le créateur de la ressource) et ses descendants ont accès à la ressource;
o une valeur entière spécifiant la clé de la ressource (e.g. 1234); cette clé permettra aux autres
processus d'accéder à la ressource IPC créée.
 flg est un drapeau spécifiant les droits d'accès sur la ressource IPC créée; ses valeurs possibles sont :
o IPC_CREAT : indique la création d'une nouvelle ressource IPC si la clé fournie n'est pas déjà
utilisée; dans le cas où la clé existe, l'appel renvoie l'identifiant de la ressource IPC existante
associée à la clé;
o IPC_EXCL : provoque l'échec de l'appel si la clé fournie est déjà utilisée par une autre ressource
IPC du même type;
o un entier spécifiant les droits d'accès à la ressource IPC.

 nsems indique le nombre de  taille indique la taille


sémaphores à créer dans ce en octets de la mémoire
groupe partagée.

1/4
2 ING

Exemple d'utilisation: Exemple d'utilisation: Exemple d'utilisation:

semid=semget(IPC_PRIVATE, shmid=shmget(1234, msgid=msgget(IPC_PRIVATE,


2,0660); sizeof(int), 0660);
IPC_CREAT|0660);
Cette ligne va créer un ensemble de Cette ligne va créer une file de
deux sémaphores en utilisant une clé Cette ligne va créer une zone de messages. Cette file ne sera
privée. Ces sémaphores ne seront mémoire partagée de la taille de 1 accessible qu'au processus et à ses
accessibles qu'au processus et à ses entier. descendants.
descendants. L’identifiant de ce Si un autre processus a déjà créé L’identifiant de cette file de message
groupe de sémaphore sera retourné une mémoire partagée avec la clé sera retourné dans msgid.
dans semid 1234, la fonction shmget ne fait
que renvoyer l'identifiant de cette
zone mémoire.
L’identifiant de cette mémoire
partagée sera retourné dans shmid.

Contrôle sur les sémaphores: Contrôle sur les mémoires Contrôle sur les files de messages:
partagées:
int semctl(int semid, int int msgctl(int msqid, int
numsem, int cmd, arg); int shmctl(int shmid, cmd, struct msqid_ds
int cmd, struct shmid_ds *buf);
*buf);

Le premier paramètre passé à ces appels est chaque fois l'identifiant de la ressource IPC (retourné par l'appel à
semget, shmget ou msgget).

Le paramètre cmd correspond à la commande que l'on souhaite réaliser sur la ressource IPC. Les valeurs possibles
pour cmd sont :
 IPC_STAT : remplit la structure pointée par buf avec les informations de la ressource IPC;
 IPC_SET : permet de configurer les autorisations d'accès (le GID et l'UID du propriétaire, les permissions et la
taille de la file) sur la ressource IPC à partir des information contenue dans buf;
 IPC_RMID : permet de supprimer la ressource IPC;

 SETVAL : initialisation du
sémaphore numsem à une
valeur déterminée (passée dans
valeur) ;
 GETVAL : provoque le
renvoie par la fonction
semctl() de la valeur du
sémaphore.

Exemple d'utilisation: Exemple d'utilisation: Exemple d'utilisation:

union semun sem_union; shmctl(shmid, IPC_RMID, msgctl(msgid, IPC_RMID,


sem_union.val = 1; NULL); NULL);
semctl(semid, 3,
SETVAL,sem_union); Cette ligne va supprimer la zone Cette ligne va supprimer la file de

2/4
2 ING

de mémoire partagée. messages.


Cette ligne va fixer à 1 la valeur
du sémaphore numéro 3 (= 4ème
sémaphore) dans l’ensemble de
sémaphore semid.

Opérations down et up sur les Utilisation de la mémoire Envoi et réception de messages:


sémaphores: partagée:
int msgsnd(int msgid, struct
int semop(int semid, Pour attacher le processus à la msgbuf *msg, size_t taille,
struct sembuf mémoire partagée: int attributs);
*semops, size_t void *shmat(int shmid,
numsemops); const void *shmaddr, int msgrcv(int msgid, struct
struct sembuf { int shmflg); msgtxt *msg, size_t taille,
// numéro du sémaphore long mtype, int attributs);
short sem_num; Pour détacher le processus de la
// opération à réaliser mémoire partagée: Un message est défini par la structure
//(down → 1 shmdt(void *); suivante:
et up → +1) struct msgtxt {
short sem_op;  shmid est l’identificateur de long mtype;
// paramètres spéciaux la zone mémoire char mtext[TAILLE_TEXTE];
short sem_flg; (valeur renvoyée par };
} shmget());
Les paramètres utilisés par ces fonctions
 shmaddr est l’adresse à
 semid : est l'identifiant de laquelle la mémoire doit être
sont les suivants:
l'ensemble de sémaphores attachée au processus courant  msgid: est l'identifiant d'une file
(valeur renvoyée par (si cette valeur vaut NULL, le existante (renvoyé par msgget());
semget()); système trouve automatiquement  msg: est un pointeur vers une
 semops : est un pointeur une adresse libre) ; structure contenant le type de message
vers un tableau de structures  shmflg est un drapeau et son contenu;
de type struct sembuf; binaire (SHM_R | SHM_W).  taille: est la longueur en octets du
 numsemops : est le nombre message (type non compris);
d'opérations définies dans le  mtype: est le type de message
tableau pointé par semops. à recevoir;
o mtype = 0 : indique que
Valeurs possibles pour semflg : l'on veut recevoir le prochain message
 IPC_NOWAIT : indique que arrivant dans la file;
l'opération est non bloquante. o mtype > 0 : indique
Si l'opération ne peut pas être que l'on veut recevoir le prochain message
accomplie immédiatement, du type mtype arrivant dans la file;
semop retourne 1. o mtype < 0 : réclame le
 SEM_UNDO : indique que premier message disponible
l'opération doit être annulée si ayant le plus petit type
le processus ayant réalisé cette inférieur ou égal à la valeur
opération vient à se terminer. absolue de mtype.
 attributs : généralement
Exemple d'utilisation: Exemple d'utilisation: fixé à 0 pour obtenir les options par
struct sembuf sem; défaut; peut être une combinaison binaire
sem.sem_num = 2; int *writers;
de flags suivants :
sem.sem_op = 1; writers = (int *)
o IPC_NOWAIT : rend les
sem.sem_flg = 0; shmat(shmid, NULL,

3/4
2 ING

semop(semid, &sem, 1); SHM_R| fonctions nonbloquantes. Si la


Ce code réalise une opération de SHM_W); // Rattachement file est pleine (msgsnd) ou s'il
type down sur sur le 3ème au processus n'y a pas de message du type
sémaphore du groupe semid. ... désiré dans la file (msgrcv),
shmdt(writers); l'opération retourne 1
o MSG_EXCEPT : réclame un
message de n'importe quel
type sauf mtype.

4/4

Вам также может понравиться