LES SEMAPHORES SOUS UNIX

Documents pareils
Chapitre 2. Les processus. 2.1 Introduction. 2.2 les différents états d un processus

Programmation système

Cours Programmation Système

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Introduction aux Systèmes et aux Réseaux

Les processus. Système L3, /39

Le prototype de la fonction main()

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Programmation système en C/C++

Les processus légers : threads. Système L3, /31

Cours 6 : Tubes anonymes et nommés

Unix : Programmation Système

Rappels Entrées -Sorties

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Bases de programmation. Cours 5. Structurer les données

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

3IS - Système d'exploitation linux - Programmation système

LEs processus coopèrent souvent pour traiter un même problème. Ces

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Cours d initiation à la programmation en C++ Johann Cuenin

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Programme Compte bancaire (code)

Introduction au langage C

Introduction à la programmation concurrente

1 Mesure de la performance d un système temps réel : la gigue


Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Introduction à la Programmation Parallèle: MPI

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

OS Réseaux et Programmation Système - C5

Programmation C++ (débutant)/instructions for, while et do...while

Algorithmique et Programmation, IMA

Le langage C. Séance n 4

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Chapitre 10. Les interfaces Comparable et Comparator 1

Java Licence Professionnelle CISII,

Programmation système de commandes en C

Conventions d écriture et outils de mise au point

INITIATION AU LANGAGE JAVA

I. Introduction aux fonctions : les fonctions standards

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

TP : Gestion d une image au format PGM

Arguments d un programme

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Playing with ptrace() for fun and profit

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Qu'est-ce qu'un processus: Définitions

Chap III : Les tableaux

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Programmation système I Les entrées/sorties

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

Lier Erlang avec d autres langages de programmation

Service d'authentification LDAP et SSO avec CAS

Outils pour la pratique

MEDIAplus elearning. version 6.6

Gestion des processus

Les processus 2/54. Qu est-ce qu un processus? 3(6)/54. Se souvenir 1(1)/54. Le système de fichiers (exemple du disque dur)

LES REGLEMENTS AVEC SOCIEL.NET DERNIERE MISE A JOUR : le 14 juin 2010

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Les structures. Chapitre 3

Plan du cours. Historique du langage Nouveautés de Java 7

Programmation Système (en C sous linux) Rémy Malgouyres LIMOS UMR 6158, IUT département info Université Clermont 1, B.P.

Exécutif temps réel Pierre-Yves Duval (cppm)

Cours de Programmation Impérative: Zones de mémoires et pointeurs

ACTIVITÉ DE PROGRAMMATION

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Cours d Algorithmique et de Langage C v 3.0

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Table des matières Hakim Benameurlaine 1

INITIATION A LA PROGRAMMATION

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Chapitre 4 : Outils de communication centralisés entre processus

La Comptabilité UNIX System V Acctcom

Communication par sockets

L exclusion mutuelle distribuée

Communication Interprocessus

Les débordements de tampons et les vulnérabilités de chaîne de format 1

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Le traitement du temps

Imprimantes et partage réseau sous Samba avec authentification Active Directory

UE Programmation Impérative Licence 2ème Année

Claude Delannoy. 3 e édition C++

Programmation impérative

Premiers Pas en Programmation Objet : les Classes et les Objets

Problèmes liés à la concurrence

Structure d un programme

Transcription:

Chapitre 12 LES SEMAPHORES SOUS UNIX 1. PRINCIPE DES SEMAPHORES SOUS UNIX Pour créer un sémaphore, l'utilisateur doit lui associer une clé. le système lui renvoie un identificateur de sémaphore auquel sont attachés n sémaphores numérotés de 0 à n-1. Pour spécifier un sémaphore parmi les n, l'utilisateur indique l'identificateur et le numéro du sémaphore. A chaque identificateur de sémaphore sont associés des droits d'accès. Ces droits sont nécessaires pour effectuer des opérations sur les sémaphores, mais inopérants pour : - la destruction d'un identificateur de sémaphore, - la modification des droits d'accès. Seul le créateur, le propriétaire ou le super-utilisateur peuvent réaliser ces opérations. 1.1 Le fichier <sys/sem.h> A chaque ensemble de sémaphores sont associées les structures semid_ds (une par ensemble de sémaphores), sem et sembuf (une par sémaphore) décrites dans <sys/sem.h> struct sem /* correspond à la structure d'un sémaphore dans le noyau */ unsigned short semval; /* valeur du sémaphore */ unsigned short sempid; /* pid du dernier processus utilisateur */ unsigned short semcnt; /* nombre de processus attendant l'incrémentation du sémaphore */ unsigned short semzcnt; /* nombre de processus attendant que semval soit nul */ ; struct sembuf /* correspond à une opération sur un sémaphore */ unsigned short sem_num; /* n de sémaphore : 0,... */ short sem_op; /* opération sur le sémaphore */ short sem_flg; /* option */ ; struct semid_ds /* correspond à la structure d'une entrée dans la table des sémaphores */ struct ipc_perm sem_perm; /* les droits */ struct sem * sem_base; /* pointeur sur le premier sémaphore de l'ensemble */ time_t sem_otime; /* date dernière opération par semop */ ushort sem_nsems; /* nombre de sémaphores de l'ensemble */ time_t sem_ctime; /* date dernière modification par semctl */ ; Systèmes d'exploitation et programmation système Yves PAGNOTTE Chapitre 12 1 / 5

1.2 La fonction semget int semget ( key_t cle, int nb_sem, int option) nb_sem : nombre de sémaphores de l'ensemble cle : si cle = IPC_PRIVATE, un nouvel ensemble de sémaphores est créé sans clé d'accès sinon, il y a appel a ftok. si cle ne correspond pas à un ensemble de sémaphores existant si IPC_CREAT n'est pas positionné : erreur et retour de -1 sinon, un nouvel ensemble de sémaphores est créé et associé à cette clé. Les droits d'accès sont ceux mentionnés; le propriétaire et créateur est le propriétaire effectif du processus; le groupe propriétaire et créateur est le groupe propriétaire effectif du processus sémaphores sinon si IPC_CREAT et IPC_EXCL sont tous deux positionnés : erreur et retour de -1 sinon la fonction retourne l'identificateur de l'ensemble de option : on peut combiner par des droits d'accès et les constantes suivantes : SEM_A : permission de modification SEM_R : permission en lecture IPC_CREAT, IPC_EXCL La fonction : key_t ftok (char * path, int id) utilise une chaîne de caractères (en principe un nom de fichier unique dans le système ), la combine à id pour générer une clé unique dans le système, sous forme d'un key_t (équivalent à un entier long). Exemple : récupération de l'identificateur d'un ensemble de 5 sémaphores num = semget (ftok (path, cle), 5, 0) Exemple : /* création de 4 sémaphores associés à la clé 456 */ #include <errno.h> #define CLE 456 main () int semid ; /* identificateur des sémaphores */ char *path = "nom_de_fichier_existant"; if (( semid = semget (ftok (path, (key_t) CLE), 4, IPC_CREAT IPC_EXCL SEM_R SEM_A)) == -1) perror ("échec de semget\n"); exit (1); printf (" identificateur de l'ensemble : %d\n", semid); printf ("clé de l'ensemble : %d\n", ftok (path, (key_t) CLE)); 1.3 La fonction semctl int semctl ( int semid, int semnum, int cmd, arg) semid : identificateur de l'ensemble de sémaphores semnum : numéro du sémaphore traité Systèmes d'exploitation et programmation système Yves PAGNOTTE Chapitre 12 2 / 5

union semun int val; struct semid_ds *buf; ushort array [ <nb de sémaphores>]; arg; cmd : paramètre de commande pouvant prendre 10 valeurs : GETVAL : retourne la valeur du sémaphore de n semnum SETVAL : le sémaphore de n semnum reçoit la valeur arg.val GETPID : retourne le pid du processus qui est intervenu en dernier lieu GETNCNT : retourne le nombre de processus en attente d'une incrémentation de la valeur du sémaphore de n semnum GETZCNT : retourne le nombre de processus en attente du passage à 0 du sémaphore de n semnum GETALL : range les valeurs de tous les sémaphores dans le tableau pointé par arg.array SETALL : positionne les valeurs de tous les sémaphores à l'aide des valeurs du tableau pointé par arg.array IPC_STAT : la structure associée à semid est rangée à l'adresse contenue dans arg.buf IPC_SET : positionne les valeurs gid, uid et mode à partir de la structure pointée par arg.buf IPC_RMID : détruit le sémaphore 1.4 La fonction semop int semop (int semid, struct sembuf (* sops) [ ], int nbops) retourne semval du dernier sémaphore manipulé ou -1 en cas d'erreur semid : identificateur de l'ensemble de sémaphores sops : pointeur vers un tableau de nbops structures de type sembuf (cf. page 1) Pour chaque sémaphore de n sem_num (0 à nbops-1), on indique dans le champ sem_op l'opération à effectuer avec un code entier : si sem_op > 0 : semval = semval + sem_op si sem_op = 0 : si semval = 0, rien n'est effectué sinon le processus est endormi en attendant la nullité de semval si sem_op < 0: si semval >= sem_op, alors semval semval - sem_op sinon, le processus est endormi jusqu'à : semval >= sem_op Pour le champ sem_flg : s'il vaut IPC_NOWAIT, évite le blocage de processus et retourne un code d'erreur s'il vaut SEM_UNDO, on évite de bloquer indéfiniment des processus sur des sémaphores après la mort accidentelle d'un processus. Très coûteux en temps CPU et en mémoire Systèmes d'exploitation et programmation système Yves PAGNOTTE Chapitre 12 3 / 5

2. LES OPERATEURS P ET V (WAIT et SIGNAL au sens de DIJKSTRA) /* Appelons ce fichier par exemple : "Dijkstra.h" Il est évidemment à inclure dans le programme utilisateur*/ #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> /*************************************************************/ int sem_create (key_t CLEF, int initval) /* crée un ensemble d'un seul sémaphore dont la clé est reliée à CLEF, de valeur initiale initval retourne l'identifiant associé au sémaphore si OK, sinon retourne -1 Si l'ensemble associé à CLEF existe déjà, la fonction part en échec. Les droits sont positionnés de sorte que tout processus peut modifier le sémaphore */ union semun int val; struct semid_ds *buf; ushort *array; arg_ctl; int semid; semid = semget ( ftok ("Dijkstra.h-<votre login>", CLEF), 1, IPC_CREAT IPC_EXCL 0666); if (semid == -1) return -1; arg_ctl.semval = initval; if (semctl (semid, 0, SETVAL, arg_ctl) == -1) return -1; return semid; int sem_delete ( int semid) /* supprime l'ensemble de sémaphores identifiés par semid */ return semctl (semid, 0, IPC_RMID, 0) ; int P (int semid) struct sembuf sempar; sempar.sem_num = 0; sempar.sem_op = -1; sempar.sem_flg = SEM_UNDO; return semop (semid, &sempar, 1); int V (int semid) struct sembuf sempar; sempar.sem_num = 0; sempar.sem_op = 1; sempar.sem_flg = SEM_UNDO; return semop (semid, &sempar, 1); Systèmes d'exploitation et programmation système Yves PAGNOTTE Chapitre 12 4 / 5

En outre, la commande shell ipcs permet d'obtenir des informations sur les objets de type ensemble de sémaphores (et plus généralement tous les IPC), avec l'option : - s pour se limiter aux sémaphores - m pour se limiter aux segments de mémoire - q pour se limiter aux files de messages - c pour faire épparaître l'identité de l'utilisateur créateur Elle fournit : T : type de l'objet (q, m ou s) ID : identification interne de l'objet KEY : clé de l'objet en hexadécimal MODE : droits d'accès à l'objet. Les 2 premiers des 11 caractères indiquent des informations spécifiques à une file de messages ou à un segment de mémoire partagée OWNER : identité du propriétaire GROUP : identité du groupe propriétaire 3. EXEMPLE DE PROGRAMMATION CONCURRENTE main () int i, CLE = 33, mutex = 0; if ((mutex = sem_create ( CLE, 1)) == -1) perror ("problème de création du sémaphore "); exit (-1); printf ("création du sémaphore d'identifiant %d\n", mutex); if (fork () == 0) printf ("je suis le processus %d, fils de %d\n", getpid (), getppid ()); for (i = 0; i < 3 ; i++) P (mutex); printf ("le fils entre dans sa section critique\n"); sleep (15); printf ("le fils sort de sa section critique\n"); V (mutex); exit (0); else for (i = 0 ; i < 4 ; i++) P (mutex); printf ("le pere entre dans sa section critique\n"); sleep (10); printf ("le pere sort de sa section critique\n"); V (mutex); wait (0); printf ("FIN!\n"); sem_delete (mutex); Systèmes d'exploitation et programmation système Yves PAGNOTTE Chapitre 12 5 / 5