Tubes & Signaux. Samia Bouzefrane & Ziad Kachouh

Documents pareils
Cours 6 : Tubes anonymes et nommés

Programmation système en C/C++

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

Cours Programmation Système

Introduction aux Systèmes et aux Réseaux

Communication Interprocessus

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

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)

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

Programmation système

Cours de S.E. les Signaux

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

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

Cours de Systèmes d Exploitation

ENSP Strasbourg (Edition ) Les Systèmes Temps Réels - Ch. DOIGNON. Chapitre 3. Mise en œuvre : signaux, gestion du temps et multi-activités

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)

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

Programmation système de commandes en C

Le traitement du temps

Cours 14 Les fichiers

Le prototype de la fonction main()

Cours de Système : Gestion de Fichiers

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

Programmation système I Les entrées/sorties

Algorithmique et Programmation, IMA

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

Les processus. Système L3, /39

GESTION DES FICHIERS C/UNIX

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Le système de gestion des fichiers, les entrées/sorties.

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

Programmation impérative

Les structures de données. Rajae El Ouazzani

Introduction au langage C

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

Les structures. Chapitre 3

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.

Gestion des processus

Unix : Programmation Système


Playing with ptrace() for fun and profit

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

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Outils pour la pratique

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Initiation. àl algorithmique et à la programmation. en C

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

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

Le langage C. Séance n 4

Architecture d un système d exploitation

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

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

TD3: tableaux avancées, première classe et chaînes

I. Introduction aux fonctions : les fonctions standards

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

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

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

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

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

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

Les fichiers. Chapitre 4

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

Programmation en langage C

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

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

Introduction à la Programmation Parallèle: MPI

Rappels Entrées -Sorties

1 Lecture de fichiers

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

SYSTÈME DE GESTION DE FICHIERS

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Langage Java. Classe de première SI

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

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Chap III : Les tableaux

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

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

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

Cours Informatique Master STEP

Programmation Internet en Java

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

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

Communication par sockets

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

Programmation Classique en langage C

OS Réseaux et Programmation Système - C5

COMMUNICATION PC/MINITEL

EPREUVE PRATIQUE DES TECHNIQUES INFORMATIQUES ACTIVITE N 1. Thème de l activité : Configuration d un firewall

as Architecture des Systèmes d Information

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Java Licence Professionnelle CISII,

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Transcription:

Tubes & Signaux Samia Bouzefrane & Ziad Kachouh http://cedric.cnam.fr/~bouzefra

Les Tubes Les tubes ordinaires Lecture/écriture dans un tube ordinaire Les tubes nommés Lecture/écriture dans un tube nommé 2

Introduction aux tubes Tube : mécanisme de communication unidirectionnel. Possède deux extrémités, une pour y lire et l autre pour écrire La lecture dans un tube est destructrice: l info lue est supprimée du tube Les tubes permettent la communication d un flot continu de caractères (mode stream) Un tube a une capacité finie La gestion des tubes se fait en mode FIFO Écriture : p[1] Lecture : p[0] 3

Les tubes ordinaires A un tube est associé un nœud du système de gestion de fichiers (son compteur de liens est = 0 car aucun répertoire ne le référence). Le tube sera supprimé et le noeud correspondant libéré lorsque plus aucun processus ne l'utilise. Un tube ordinaire n a pas de nom. L'existence d'un tube correspond à la possession d'un descripteur acquis de deux manières: -un appel à la primitive de création de tube pipe; -par héritage: un processus fils hérite de son père des descripteurs de tubes, entre autres. 4

La création d un tube ordinaire #include<unistd.h> int pipe(int crée un tube, c-à-d: p[2]); - un noeud sur le disque des tubes, - deux entrées dans la table des fichiers ouverts (1 en lecture, 1 en écriture), c-à-d deux descripteurs dans la table des processus appelant. pipe retourne dans p respectivement les descripteurs de lecture et d'écriture: p[0] est le descripteur en lecture p[1] celui en écriture. 5

La lecture dans un tube ordinaire La lecture se fait grâce à la primitive read: Exemple: char buf [10]; int nbr_car=10; int nb_lu; nb_lu= read(p[0], &buf, nbr_car); correspond à la lecture d'au plus nbr_car caractères qui seront rangés dans une zone pointée par buf. 6

Fonctionnement d un read Si tube non vide et contient nbr caractères alors Sinon Fsi la primitive extrait du tube nb_lu=min (nbr, nbr_car) caractères et les place à l'adresse buf; Si nombre d'écrivains = 0, la fin de fichier est atteinte alors Fsi aucun caractère n'est lu et la primitive renvoie la valeur nb_lu=0; Si nombre d'écrivains!= 0 alors Fsi Si lecture bloquante alors le processus est bloqué jusqu'à tube non vide; Fsi; Si lecture non bloquante alors Fsi; le retour est immédiat et la valeur de retour est -1 et errno=eagain 7

L écriture dans un tube ordinaire Elle se fait à l'aide de la primitive write. Exemple: int nb_ecrit; char buf[8]="bonjour\0"; int n=8; nb_ecrit= write(p[1], buf, n); demande l'écriture dans le tube de descripteur p[1] de n caractères accessibles à l'adresse buf. Remarque: n doit être PIPE_BUF défini dans <limits.h>. 8

Fonctionnement d un write Si nombre de lecteurs dans le tube = 0 alors Sinon fsi le signal SIGPIPE est envoyé au processus, ayant pour handler de terminer ce processus; si écriture bloquante alors sinon le retour de la primitive (avec la valeur n) n'a lieu que lorsque les n caractères ont été écrits (le processus passe à l'état bloqué dans l'attente que le tube se vide); si n > PIPE_BUF alors le retour est un nombre < n éventuellement -1 fsi si n PIPE_BUF et nbre emplacements libres dans le tube >= n alors une écriture atomique est réalisé; fsi si n PIPE_BUF et nbre emplacements libres dans le tube < n alors le retour est immédiat sans écriture avec la valeur de retour 0 ou -1 fsi 9

#include <stdio.h> #include <unistd.h> int tube[2]; char buf[20]; Exemple d utilisation main() { pipe(tube); if (fork()==0) { /* fils */ close(tube[0]); write(tube[1], "bonjour", 8); else { /* pere */ wait(null); close(tube[1]); read(tube[0], buf, 8); printf("%s bien recu\n", buf); $./tube_exo1 $ bonjour bien recu $ 10

Les signaux Introduction Les types de signaux L envoi d un signal Prise en compte d un signal Installation de nouveau handlers L attente d un signal Signaux particuliers 11

Introduction Signal Interruption: événement extérieur au processus Frappe au clavier Signal déclenché par programme: primitive kill, Déroutement: événement intérieur au processus généré par le hard FPE (floating point error) Violation mémoire Il existe NSIG (<signal.h>) signaux différents, identifiés par un numéro de 1 à NSIG 12

Les types de signaux Signal SIGHUP SIGINT SIGQUIT SIGILL SIGABRT SIGFPE SIGKILL SIGSEGV SIGPIPE SIGALARM SIGTERM SIGUSR1 SIGUSR2 SIGCHLD SIGSTOP SIGSUSP SIGCONT Terminaison du processus leader de session Frappe du car intr sur terminal de contrôle Frappe du car quit sur terminal de contrôle Détection d une instruction illégale Terminaison provoquée en exécutant abort Erreur arithmétique (division par zéro, ) Signal de terminaison Violation mémoire Écriture dans un tube sans lecteur Fin de temporisation (fonction alarm) Signal de terminaison Signal émis par un processus utilisateur Signal émis par un processus utilisateur Terminaison d un fils Signal de suspension Frappe du car susp sur terminal de contrôle Signal de continuation d un signal d un processus stoppé Traitement par défaut (1) (1) (2) (2) (1) (1) (1) * non modifiable (2) (1) (1) (1) (1) (1) (3) (4) * (4) (5) * La commande kill l donne la liste des signaux du système Traitements par défaut: (1) terminaison de processus (2) terminaison de processus avec image mémoire (fichier core) (3) signal ignoré (sans effets) (4) suspension du processus, (5) continuation (reprise d un processus stoppé). 13

Envoi d un signal Les processus peuvent communiquer par le biais des signaux. La commande kill envoie un signal à un processus (ou groupe de processus) : int kill (pid_t pid, int sig); sig est le nom d'un signal ou un entier entre 1 et NSIG. On peut utiliser sig = 0 pour tester l'existence d'un processus. Valeur de pid > 0 0 < -1 Signification Processus d'identité pid Tous les processus dans le même groupe que le processus Tous les processus du groupe pid 14

Exemple d envoi de signal #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> void main(void) { pid_t p; int etat; if ((p=fork()) == 0) { /* processus fils qui boucle */ while (1); exit(2); /* processus pere */ sleep(10); printf("envoi de SIGUSR1 au fils %d\n", p); kill(p, SIGUSR1); // bloque l'appelant (pere) et selectionne le fils p = waitpid(p, &etat, 0); printf("etat du fils %d : %d\n", p, etat >> 8); 15

Traitements par défaut A chaque type de signal est associé un handler par défaut appelé SIG_DFL. Les traitements par défaut sont: 1- terminaison du processus (avec/sans image mémoire : fichier core) 3- signal ignoré (sans effet) 4- suspension du processus 5- continuation : reprise d'un processus stoppé. Un processus peut ignorer un signal en lui associant le handler SIG_IGN. Les signaux SIGKILL, SIGCONT et SIGSTOP ne peuvent avoir que le handler SIG_DFL. 16

Traitements spécifiques Les signaux (autres que SIGKILL, SIGCONT et SIGSTOP) peuvent avoir un handler spécifique installé par un processus: La primitive signal() fait partie du standard de C et non de la norme de POSIX: #include<signal.h> void (*signal (int sig, void (*p_handler)(int))) (int); Elle installe le handler spécifié par p_handler pour le signal sig. La valeur retournée est un pointeur sur la valeur ancienne du handler. 17

Exemple d installation de nouveau handler Signal généré par des touches du clavier (CTL/C= SIGINT) #include <stdio.h> #include <signal.h> void hand(int signum) { printf("appui sur Ctrl-C\n"); printf("arret au prochain coup\n"); signal(sigint, SIG_DFL); int main(void) { signal(sigint, hand); for (;;) { return 0; 18

Attente d un signal La primitive pause() bloque en attente le processus appelant jusqu à l arrivée d un signal. #include<unistd.h> int pause (void); A la prise en compte d'un signal, le processus peut : - se terminer car le handler associé est SIG_DFL; - passer à l'état stoppé; à son réveil, il exécutera de nouveau pause() et s il a été réveillé par SIGCONT ou SIGTERM avec le handler SIG_IGN, il se mettra de nouveau en attente d'arrivée d'un signal; - exécuter le handler correspondant au signal intercepté. pause() ne permet pas d'attendre un signal de type donné ni de connaître le nom du signal qui l'a réveillé. 19

Exemple d attente de signal #include <stdio.h> #include <signal.h> #include <unistd.h> int nb_req=0; int pid_fils, pid_pere; void Hand_Pere( int sig ){ nb_req ++; printf("\t le pere traite la requête numero %d du fils \n", nb_req); void main() { 20

Exemple d attente de signal (suite) if ((pid_fils=fork()) == 0) { /* FILS */ pid_pere = getppid(); sleep(2); /* laisser le temps au pere de se mettre en pause */ for (i=0; i<10; i++) { printf("le fils envoie un signal au pere\n"); kill (pid_pere, SIGUSR1); /* demande de service */ exit(0); else { /* PERE */ signal(siguser1,hand_pere); while(1) { pause(); /* attend une demande de service */ sleep(5); /* realise le service */ 21

Déroutement d un signal: SIGFPE #include <signal.h> #include <stdio.h> void Hand_sigfpe() { printf("\nerreur division par 0!\n"); exit(1); main() { int a, b, Resultat; signal(sigfpe, Hand_sigfpe); printf("taper a : "); scanf("%d", &a); printf("taper b : "); scanf("%d", &b); Resultat = a/b; printf("la division de a par b = %d\n", Resultat); 22

Bibliographie 23