Communication Interprocessus
|
|
|
- Laurent Brisson
- il y a 10 ans
- Total affichages :
Transcription
1 Communication Interprocessus Introduction Segments de données et fichiers communs Les signaux Les tubes de communication d UNIX Tubes anonymes Tubes nommés Les tubes de communication de Windows Tubes anonymes Tubes nommés Chapitre 4..1 Introduction En général, plusieurs processus (threads) coopèrent pour réaliser une tâche complexe. Ces processus s'exécutent en parallèle sur un même ordinateur (monoprocesseur ou multiprocesseurs) ou sur des ordinateurs différents. Ils doivent s'échanger des informations (communication interprocessus). Il existe plusieurs mécanismes de communication interprocessus. Nous pouvons citer : les données communes (variables, fichiers, segments de données), les signaux, les messages. Chapitre
2 Segments de données et fichiers communs Les processus partagent un ensemble de données communes qui sont soit en mémoire (variables ou segments de données) ou sur disque (fichiers). Chaque processus peut accéder en lecture ou en écriture à cet ensemble de données (espace de données commun). Des problèmes d incohérence peuvent survenir lorsque plusieurs processus opèrent, en même temps, sur un espace commun. Ce problème sera étudié lors de la prochaine séance. Supposons deux processus qui partagent une variable v. Le premier processus incrémente de 1 la valeur de v alors que l autre la décrémente de 1. La valeur initiale de v est 1 : P1 : v=v+1; P2 : v=v-1; Les instructions correspondant en assembleur : P1 : load v P2 : load v add 1 sub 1 store v store v Supposons que : les processus P1 et P2 s exécutent en temps partagé, le processus P1 exécute load v et add 1. Il est suspendu juste après l exécution de add 1. le processus P2 est élu et exécute les instructions load v et sub 1 et store v. Le processus P2 se termine avec v = 0. le processus P1 est ensuite élu et exécute l instruction store v (v=2). Chapitre 4..3 Segments de données et fichiers communs (2) Les threads (POSIX) d un processus partagent la zone de données globales ainsi que la table des descripteurs de fichiers du processus. Lors de la création d un processus (fork), la table des descripteurs de fichiers est dupliquée. Les processus créateur et créé partageront le même pointeur de fichier pour chaque fichier déjà ouvert lors de la création. Il est possible de créer des segments de données, de les rattacher et de les détacher des processus. On peut ainsi créer des segments de données communs à plusieurs processus. Chapitre
3 Segments de données et fichiers communs (3) Les appels système pour la création de segments partagés sont dans les librairies : <sys/ipc.h> et <sys/shm.h>. L appel système shmget permet de créer ou de retrouver un segment de données. L appel système shmat permet d attacher un segment de données à un processus. L appel système shmctl permet, entre autres, de détacher un segment d un processus. Exemple de communication au moyen de segment partagé : Les deux programmes suivants communiquent au moyen d un segment créé par le premier. Le segment de données est de clé 5. Seuls les processus du groupe peuvent y accéder. L accès est exclusif. Le premier programme attache le segment créé à son espace de données puis écrit dans ce segment la valeur Enfin, il détache après deux secondes le segment de son espace d adressage. Le second programme attache le segment à son espace de données puis accède en lecture au segment. Ensuite, il détache le segment de son espace d adressage. Chapitre 4..5 Segments de données et fichiers communs (4) // programme shm1.cpp #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #include <iostream.h> int main ( ) { char * add; int status, cle = 5; if( (status = shmget(cle, sizeof(int), IPC_CREAT IPC_EXCL 0600))==-1) exit(1); cout << "status "<< status<< endl; if((add =(char *) shmat(status,null,0)) == (char *)-1) exit(2); int* entier= (int *) add; *entier = 1190; sleep(2); if( shmctl(status, IPC_RMID, NULL) == -1) exit(3); exit(0); Chapitre
4 Segments de données et fichiers communs (5) // programme shm2.cpp #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #include <iostream.h> int main ( ) { char * add; int status, cle = 5; if( (status = shmget(cle, sizeof(int), 0))==-1) exit(1); cout << "status "<< status<< endl; if((add =(char*) shmat(status,null,0)) == (char *) -1) exit(2); int* entier= (int *) add; cout << "entier = " << *entier << endl; if( shmctl(status, IPC_RMID, NULL) == -1) exit(3); exit(0); pascal> shm1 & shm2 & [4] [5] status status entier = 1190 Chapitre 4..7 Les signaux Un signal est une interruption logicielle asynchrone qui a pour but d informer de l arrivée d un événement (outil de base de notification d évènement). La fonction kill() permet d envoyer un signal à un processus. Ce mécanisme de communication permet à un processus de réagir à un événement sans être obligé de tester en permanence l arrivée. De nombreuses erreurs détectées par le matériel comme l exécution d une instruction non autorisée ( division par 0) ou l emploi d une adresse non valide, sont converties en signaux qui sont envoyés (émis) au processus fautif. Le système d exploitation gère un ensemble de signaux. Chaque signal a un nom, un numéro, un gestionnaire (handler) et est associé à un type d événement (man 7 signal). SIGINT 2 SIGQUIT 3 SIGALARM 14 SIGKILL 9 SIGUSR1 30,10,16 SIGPIPE 13 SIGUSR2 31,12,17 SIGCHLD 20,17,18 SIGCONT 19,18,25 SIGSTOP 17,19,23 De façon simplifiée, quand un signal arrive, le noyau interrompt le processus qui déclanche alors son gestionnaire du signal pour réagir de façon appropriée. Un processus peut également se mettre en attente de signaux (pause(), sigpause()). Chapitre
5 Les signaux (2) Gestionnaire de signal Comme on ne peut pas prévoir à l avance à quel moment un signal va arriver ni même s il doit arriver, une fonction est enregistrée à l avance pour chaque signal (gestionnaire de signal). Le système d exploitation associe à chaque signal un traitement par défaut (gestionnaire par défaut du signal) : abort (génération d un fichier core et arrêt du processus); exit (terminaison du processus sans génération d un fichier core); ignore (le signal est ignoré); stop (suspension du processus); continue (reprendre l exécution si le processus est suspendu sinon le signal est ignoré). Par exemple, SIGUSR1 et SIGUSR2 tuent le processus, SIGCHLD est ignoré (man 7 signal pour plus de détails). Chapitre 4..9 Les signaux (3) Gestionnaire de signal Le système d exploitation permet à un processus de redéfinir pour certains signaux leurs gestionnaires. Un processus peut donc indiquer au système ce qui doit se passer à la réception d un signal : ignorer le signal (certains signaux ne peuvent être ignorés), le prendre en compte (en exécutant le traitement spécifié par le processus), exécuter le traitement par défaut, ou le bloquer (le différer). Si un processus choisit de prendre en compte un signal qui lui est destiné (capture d un signal), il doit alors spécifier la procédure de gestion de signal. Par exemple, la touche d interruption Ctrl+C génère le signal SIGINT. Par défaut, ce signal arrête le processus. Le processus peut associer à ce signal un autre gestionnaire de signal. Les signaux SIGKILL et SIGSTOP ne peuvent être ni capturés, ni ignorés, ni bloqués. Chapitre
6 Les signaux (4) Envoi d un signal L appel système qui permet d envoyer un signal à un processus kill (man 2 kill) #include <sys/types.h> #include <signal.h> int kill ( pid_t pid, int sig); Si pid >0, le signal sig est envoyé au processus pid. Si pid = 0, le signal est envoyé à tous les processus du groupe du processus émetteur. Il retourne 0 en cas de succès et -1 en cas d erreur. Dans le cas du système UNIX, un processus utilisateur peut envoyer un signal à un autre processus. Les deux processus doivent appartenir au même propriétaire ou le processus émetteur du signal est le super-utilisateur. Chapitre Les signaux (5) Réception d un signal Un processus vérifie si il a reçu un signal aux transitions suivantes : quand il repasse du mode noyau au mode utilisateur c est-à-dire quand il a terminé un appel système. Ce qui veut dire que le traitement du signal est différé tant que le processus destinataire n est pas revenu en mode utilisateur avant de passer dans un état bloqué en sortant de l état bloqué. L adresse de retour de la fonction qui traite le signal est celle de l instruction suivant celle qui a provoqué le déclenchement. Le traitement des signaux reçus se fait dans le contexte d exécution du processus, La réception d un signal est matérialisée par un bit positionné à 1 dans un tableau associé au processus. Chapitre
7 Les signaux (6) Capture d un signal Signaux fiables et non fiables Dans les versions "anciennes" d Unix le mécanisme des signaux était non fiable à cause de leur procédure de prise en compte : arrivée du signal, réinitialisation du mécanisme de capture des signaux puis exécution du gestionnaire. Donc si un second signal arrive entre la réinitialisation et l appel, le premier signal est perdu. On parle de conflit d exécution. La fonction signal(3) du C est considérée comme non fiable. #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); Le premier paramètre est le numéro ou le nom du signal à capturer Le second est la fonction gestionnaire à exécuter à l arrivée du signal. SIG_DFL désigne l action par défaut et SIG_IGN indique au système que le processus appelant veut ignorer le signal. signal retourne le gestionnaire précédent ou SIG_ERR en cas d erreur. Un autre jeu de fonctions basé sur la fonction sigaction(2) a été proposé pour remédier à ce problème. Chapitre Les signaux (7) Capture d un signal L appel système sigaction permet de redéfinir le gestionnaire associé à un signal. #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) ; La fonction sigaction utilise une structure sigaction : void (*sa_handler)(int) ; /* le gestionnaire */ sigset_t sa_mask ; /* le masque */ int sa_flags ; /* options */... On peut associer un même gestionnaire à des signaux différents. Chapitre
8 Les signaux (8) Attente d un signal L appel système pause suspend l appelant jusqu au prochain signal. #include <unistd.h> int pause (void); L appel système sleep(v) suspend l appelant jusqu au prochain signal ou l expiration du délai (v secondes). #include <unistd.h> void sleep (int ); Chapitre Les signaux (9) Exemple 0 : Signal SIGINT // signaux0.c #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int count = 0; static void action(int sig) { ++count ; write(1,"capture du signal SIGINT\n", 26) ; int main() { // Spécification de l'action du signal signal (SIGINT, action); printf("debut:\n"); do { sleep(1); while (count <3); return 0; d > gcc signaux0.c -o signaux0 d > signaux0 Debut: capture du signal SIGINT capture du signal SIGINT capture du signal SIGINT Chapitre
9 Les signaux (10) Exemple 1 : Échanges de signaux // signaux1.c #include <signal.h> #include <stdio.h> #include <unistd.h> #include <wait.h> static void action(int sig) { switch (sig) { case SIGUSR1: printf("signal SIGUSR1 reçu\n"); break; case SIGUSR2: printf("signal SIGUSR2 reçu\n"); break; default: break; Chapitre Les signaux (11) Exemple 1 (suite) int main() { struct sigaction new_action, old_action; new_action.sa_handler = action; sigemptyset (&new_action.sa_mask); new_action.sa_flags = 0; int i, pid, etat; if( sigaction(sigusr1, &new_action,null) <0) perror("erreur de traitement du code de l'action\n"); if( sigaction(sigusr2, &new_action,null) <0) perror("erreur de traitement du code de l'action\n"); if((pid = fork()) == 0){ kill(getppid(), SIGUSR1); // Envoyer signal au parent. for(;;) pause(); // Mise en attente d'un signal else { kill(pid, SIGUSR2); // Envoyer un signal à l'enfant printf("parent : terminaison du fils\n"); kill(pid, SIGTERM); // Signal de terminaison à l'enfant wait(&etat); // attendre la fin de l'enfant printf("parent : fils a terminé\n"); d > gcc signaux1.c -o signaux1 d > signaux1 Parent : terminaison du fils Parent : fils termine Le père envoie SIGUSR2 et SIGTERM avant que le fils n émette SIGUSR1 Chapitre
10 Les signaux (12) Exemple 1 (complété) int main() { struct sigaction new_action, old_action; new_action.sa_handler = action; sigemptyset (&new_action.sa_mask); new_action.sa_flags = 0; int i, pid, etat; if( sigaction(sigusr1, &new_action,null) <0) perror("erreur de traitement du code de l'action\n"); if( sigaction(sigusr2, &new_action,null) <0) perror("erreur de traitement du code de l'action\n"); if((pid = fork()) == 0){ pause(); kill(getppid(), SIGUSR1); // Envoyer signal au parent. for(;;) pause(); // Mise en attente d'un signal else { kill(pid, SIGUSR2); // Envoyer un signal à l'enfant pause(); printf("parent : terminaison du fils\n"); kill(pid, SIGTERM); // Signal de terminaison à l'enfant wait(&etat); // attendre la fin de l'enfant printf("parent : fils a terminé\n"); d > gcc signaux1.c -o signaux1 d > signaux1 Signal SIGUSR2 reçu Signal SIGUSR1 reçu Parent : terminaison du fils Parent : fils a terminé Chapitre Les signaux (13) Masquage d un signal L appel système sigprocmask permet de bloquer (masquer) ou débloquer un ensemble de signaux #include <signal.h> int sigprocmask( int how, // SIG_BLOCK, SIG_UNBLOCK ou SIG_SETMASK const sigset_t * set, // set est l ensemble des signaux à bloquer ou débloquer sigset_t* oldset // oldset reçoit l ensemble des signaux bloqués avant d effectuer l action indiquée par how ); SIG_BLOCK : pour ajouter les signaux de set à l ensemble des signaux bloqués. SIG_UNBLOCK : pour enlever les signaux de set de l ensemble des signaux bloqués. SIG_SETMASK : pour remplacer l ensemble des signaux bloqués par set. Chapitre
11 Les signaux (14) Masquage d un signal Lorsqu un signal bloqué est émis, il est mis en attente jusqu à ce qu il devienne non bloqué. L appel système sigpending permet de récupérer les signaux en attente. int sigpending (sigset_t *set); L appel système sigsuspend permet d autoriser la levée d un ensemble de signaux : int sigsuspend (const sigset_t *set); Chapitre Les signaux (15) Exemple 2 // test_signaux.c #include <signal.h> #include <stdio.h> #include <unistd.h> static void action(int sig) { printf("on peut maintemant m'eliminer\n"); signal(sigterm, SIG_DFL); int main() { if( signal(sigterm, SIG_IGN) == SIG_ERR) perror("erreur de traitement du code de l'action\n"); if( signal(sigusr2, action) == SIG_ERR) perror("erreur de traitement du code de l'action\n"); while (1) pause(); Chapitre
12 bash-2.05b$ gcc -o test-signaux test-signaux.c bash-2.05b$./test-signaux & [1] 4664 bash-2.05b$ ps PID TTY TIME CMD 4637 pts/2 00:00:00 bash 4664 pts/2 00:00:00 test-signaux 4665 pts/2 00:00:00 ps bash-2.05b$ kill -SIGTERM 4664 bash-2.05b$ ps PID TTY TIME CMD 4637 pts/2 00:00:00 bash 4664 pts/2 00:00:00 test-signaux 4666 pts/2 00:00:00 ps bash-2.05b$ kill -SIGUSR bash-2.05b$ On peut maintenant m'eliminer bash-2.05b$ ps PID TTY TIME CMD 4637 pts/2 00:00:00 bash 4664 pts/2 00:00:00 test-signaux 4667 pts/2 00:00:00 ps bash-2.05b$ kill -SIGTERM 4664 bash-2.05b$ ps PID TTY TIME CMD 4637 pts/2 00:00:00 bash 4668 pts/2 00:00:00 ps [1]+ Terminated./test-signaux bash-2.05b$ Chapitre Les signaux (16) Limitations Les signaux ont néanmoins des limitations : Ils coûtent chers car ils sont lancés par un appel système, le récepteur est interrompu, sa pile à l exécution est modifiée, le gestionnaire prend la main, la pile à l exécution est restaurée. Ils sont en nombre limité (environ une trentaine dont seulement deux signaux ne sont pas utilisés par le système lui même). Ils sont strictement limités au rôle de notification d évènement et ne véhiculent pas d information (même pas l identité de l émetteur). Chapitre
13 Exercice 1 Le signal SIGCHLD est un signal qui est automatiquement envoyé par le fils à son père lorsque le fils se termine (par un exit, un return, ou autre). Ajoutez une fonction et le code nécessaire pour que le père n attende jamais son fils de façon bloquante et le fils ne devienne pas zombie. /*0*/ int main(int argc, char *argv[]) { /*1*/ if (!fork()) { /*2*/ for (int i = 0 ; i <10 ; i++) ; //simule un petit calcul /*3*/ exit(1) ; /*4*/ /*5*/ while(1) ; //Simule un calcul infini /*6*/ Chapitre Les tubes de communication d UNIX Un autre mécanisme de communication entre processus est l échange de messages. Chaque message véhicule des données. Un processus peut envoyer un message à un autre processus se trouvant sur la même machine ou sur des machines différentes. Il existe plusieurs mécanismes de communication par envoi de messages : les tubes de communication, les files de messages les sockets. Les tubes de communication permettent à deux ou plusieurs processus d'échanger des informations. On distingue deux types de tubes : Les tubes anonymes (unamed pipe), Les tubes nommés (named pipe) qui ont une existence dans le système de fichiers (un chemin d accès). Chapitre
14 Les tubes anonymes Les tubes anonymes (pipes) peuvent être considérés comme des fichiers temporaires. Ils permettent d établir des liaisons unidirectionnelles de communication entre processus dépendants. Un tube de communication permet de mémoriser des informations et se comporte comme une file FIFO. Il est caractérisé par deux descripteurs de fichiers (lecture et écriture) et sa taille limitée (PIPE_BUF) approximativement égale à 4KO. L opération de lecture dans un tube est destructrice : une information ne peut être lue qu une seule fois dans un tube. Lorsque tous les tous les descripteurs du tube seront fermés, le tube est détruit. Les tubes anonymes peuvent être créés par : l opérateur l appel système pipe( ). Chapitre Les tubes anonymes (2) communication unidirectionnelle lecture écriture Processus utilisateur Processus utilisateur SE pipe Flux de données Chapitre
15 Les tubes anonymes (3) L opérateur L'opérateur binaire dirige la sortie standard d'un processus vers l'entrée standard d'un autre processus. Exemple : La commande suivante crée deux processus reliés par un tube de communication (pipe). who wc l Elle détermine le nombre d'utilisateurs connectés au système : Le premier processus réalise la commande who. Le second processus exécute la commande wc -l. Les résultats récupérés sur la sortie standard du premier processus sont dirigés vers l'entrée standard du deuxième processus via le tube de communication qui les relie. Le processus réalisant la commande who dépose une ligne d'information par utilisateur du système sur le tube d'information. Le processus réalisant la commande wc l, récupère ces lignes d'information pour en calculer le nombre total. Le résultat est affiché à l'écran. Chapitre Les tubes anonymes (4) L opérateur Les deux processus s'exécutent en parallèle, les sorties du premier processus sont stockées dans le tube de communication. Lorsque le tube devient plein, le premier processus est suspendu jusqu'à ce qu'il y ait libération de l'espace nécessaire pour stocker des données. De façon similaire, lorsque le tube devient vide, le second processus est suspendu jusqu'à ce qu'il y ait des données sur le tube. Chapitre
16 Les tubes anonymes (5) Création Un tube de communication anonyme est créé par l'appel système: int pipe(int p[2]). Cet appel système crée deux descripteurs de fichiers. Il retourne, dans p, les descripteurs de fichiers créés : p[0] contient le descripteur réservé aux lectures à partir du tube p[1] contient le descripteur réservé aux écritures dans le tube. Les descripteurs créés sont ajoutés à la table des descripteurs de fichiers du processus appelant. Seul le processus créateur du tube et ses descendants (ses fils) peuvent accéder au tube (duplication de la table des descripteurs de fichiers). Si le système ne peut pas créer de tube pour manque d'espace, l'appel système pipe() retourne la valeur -1, sinon il retourne la valeur 0. L'accès au tube se fait via les descripteurs (comme pour les fichiers ordinaires). Chapitre int p[2] ; pipe (p) ; Les tubes anonymes (6) Création Chapitre
17 Les tubes anonymes (7) Création Les tubes anonymes sont, en général, utilisés pour la communication entre un processus père et ses processus fils, avec un processus qui écrit sur le tube, appelé processus écrivain, et un autre qui lit à partir du tube, appelé processus lecteur. La séquence d'événements pour une telle communication est comme suit : 1. Le processus père crée un tube de communication anonyme en utilisant l'appel système pipe( ) ; 2. Le processus père crée un ou plusieurs fils en utilisant l'appel système fork( ) ; 3. Le processus écrivain ferme le fichier, non utilisé, de lecture du tube ; 4. De même, le processus lecteur ferme le fichier, non utilisé, d'écriture du tube ; 5. Les processus communiquent en utilisant les appels système: read(fd[0], buffer, n) et write(fd[1], buffer,n); 6. Chaque processus ferme son fichier lorsqu'il veut mettre fin à la communication via le tube. Chapitre Les tubes anonymes (8) Exemple 3 Dans l exemple suivant, le processus père crée un tube de communication pour communiquer avec son processus fils. La communication est unidirectionnelle du processus fils vers le processus père. //programme upipe.c #include <sys/types.h> //pour les types #include <unistd.h> //pour fork, pipe, read, write, close #include <stdio.h> // pour printf #define R 0 #define W 1 int main ( ) { int fd[2] ; pipe(fd) ; // création d'un tube sans nom char message[100] ; // pour récupérer un message int nboctets ; char * phrase = " message envoyé au père par le fils"; if (fork() ==0) // création d'un processus fils { close(fd[r]) ; // Le fils ferme le descripteur non utilisé de lecture // dépôt dans le tube du message write(fd[w],phrase, strlen(phrase)+1) ; close (fd[w]) ; // fermeture du descripteur d'écriture Chapitre
18 else Les tubes anonymes (9) Exemple 3 (suite) { // Le père ferme le descripteur non utilisé d'écriture close(fd[w]) ; // extraction du message du tube nboctets = read (fd[r], message,100) ; printf ("Lecture %d octets : %s\n", nboctets, message) ; // fermeture du descripteur de lecture close (fd[r]) ; return 0 ; jupiter% gcc -o upipe upipe.cpp jupiter% upipe Lecture 36 octets : message envoyé au père par le fils Chapitre Processus STDIN STDOUT pipe(fd) Les tubes anonymes (10) Exemple 3 Processus STDIN STDOUT fd[0] fd[1] pipe fork() Processus Processus fils STDIN STDOUT fd[0] fd[1] pipe STDIN STDOUT fd[0] fd[1] Fermeture de descripteurs Processus Processus fils STDIN STDOUT fd[0] fd[1] pipe STDIN STDOUT fd[0] fd[1] Chapitre
19 Les tubes anonymes (11) Quelques précisions Chaque tube a un nombre de lecteurs et un nombre d écrivains. La fonction read() d un tube retourne 0 (fin de fichier), si le tube est vide et le nombre d écrivains est 0. L oubli de la fermeture de descripteurs peut mener à des situations d interblocage d un ensemble de processus. La fonction write() dans un tube dont le nombre de lecteurs est 0, génère le signal SIGPIPE. Par défaut, les lectures et les écritures sont bloquantes. Chapitre Les tubes anonymes (12) Redirection des entrées et sorties standards La duplication de descripteur permet à un processus de créer un nouveau descripteur (dans sa table des descripteurs) synonyme d un descripteur déjà existant. #include <unistd.h> int dup (int desc); int dup2(int desc1, int desc2); dup crée et retourne un descripteur synonyme à desc. Le numéro associé au descripteur créé est le plus petit descripteur disponible dans la table des descripteurs de fichiers du processus. #include <unistd.h> int dup (int desc); int dup2(int desc1, int desc2); dup2 transforme desc2 en un descripteur synonyme de desc1. Ces fonctions peuvent être utilisées pour réaliser des redirections des fichiers d entrées et sorties standards vers les tubes de communication. Chapitre
20 Les tubes anonymes (13) Exemple 4 Ce programme réalise l'exécution en parallèle de deux commandes shell. Un tube est créé pour diriger la sortie standard de la première commande vers l'entrée standard de la deuxième. //programme pipecom.cpp #include <unistd.h> //pour fork, close #include <stdio.h> #define R 0 #define W 1 int main (int argc, char * argv [ ] ) { int fd[2] ; pipe(fd) ; // creation d'un tube sans nom char message[100] ; // pour récupérer un message int nboctets ; char * phrase = " message envoyé au père par le fils"; if (fork()!=0) { close(fd[r]) ; // Le père ferme le descripteur non utilisé de lecture dup2(fd[w], 1) ; // copie fd[w] dans le descripteur 1) close (fd[w]) ; // fermeture du descripteur d'écriture if(execlp(argv[1], argv[1], NULL) ==-1); // exécute le programme écrivain perror("error dans execlp") ; Chapitre Les tubes anonymes (14) Exemple 4 (suite) else // processus fils (lecteur) { // fermeture du descripteur non utilisé d'écriture close(fd[w]) ; // copie fd[r] dans le descripteur 0) dup2(fd[r],0) ; close (fd[r]) ; // fermeture du descripteur de lecture // exécute le programme lecteur execlp(argv[2], argv[2], NULL) ; perror("connect") ; return 0 ; // fin du programme pipecom.cpp jupiter% gcc -o pipecom pipecom.cpp jupiter% pipecom who wc Chapitre
21 Processus STDIN STDOUT Les tubes anonymes (15) Exemple 4 (suite) pipe(fd) Processus STDIN STDOUT fd[0] fd[1] pipe fork() Processus Processus fils STDIN STDOUT fd[0] fd[1] pipe STDIN STDOUT fd[0] fd[1] redirection Processus Processus fils STDIN STDOUT pipe STDIN STDOUT exec Processus STDIN STDOUT pipe Processus fils STDIN STDOUT who wc Chapitre Les tubes anonymes (16) Remarques Le processus fils de l'exemple précédent a inclus le caractère nul dans le message envoyé au processus père. Si le processus écrivain envoie plusieurs messages de longueurs variables sur le tube, il est nécessaire d'établir des règles qui permettent au processus lecteur de déterminer la fin d'un message (protocole de communication). Par exemple, le processus écrivain peut précéder chaque message par sa longueur ou terminer chaque message par un caractère spécial comme un retour chariot ou le caractère nul. La communication bidirectionnelle est possible en utilisant deux tubes (un pour chaque sens de communication). Chapitre
22 Les tubes anonymes (17) Communication bidirectionnelle écriture Processus lecture écriture Processus utilisateur utilisateur lecture SE pipe Flux de données pipe Flux de données Chapitre Exercice 2 Chapitre
23 Chapitre Chapitre
24 Chapitre Exercice 3 Considérez le programme suivant qui a en entrée trois paramètres : deux fichiers exécutables et un nom de fichier. Ce programme crée deux processus pour exécuter les deux fichiers exécutables. Complétez le code de manière à exécuter, l un après l autre, les deux fichiers exécutables et à rediriger les sorties standards des deux exécutables vers le fichier spécifié comme troisième paramètre. On récupérera ainsi dans ce fichier les résultats du premier exécutable suivis de ceux du deuxième. int main(int argc, char* argv[]) { /*0*/ if (fork()==0) { /*1*/ execvp(argv[1], &argv[1]); /*2*/ /*3*/ if (fork()==0) { /*4*/ execvp(argv[2], &argv[2]); /*5*/ /*6*/ Chapitre
25 Les tubes nommés Les tubes de communication nommés fonctionnent aussi comme des files de discipline FIFO (first in first out). Ils sont plus intéressants que les tubes anonymes car ils offrent, en plus, les avantages suivants : Ils ont chacun un nom qui existe dans le système de fichiers (table des fichiers); Ils sont considérés comme des fichiers spéciaux ; Ils peuvent être utilisés par des processus indépendants ; à condition qu ils s exécutent sur une même machine. Ils existeront jusqu'à ce qu'ils soient supprimés explicitement ; Leur capacité maximale est 40K. Ils sont créés par la commande «mkfifo» ou «mknod» ou par l appel système mknod( ) ou mkfifo(). #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *nomfichier, mode_t mode) ; Chapitre jupiter% mkfifo mypipe Les tubes nommés (2) Commande mkfifo Affichage des attributs du tube créé jupiter% ls -l mypipe prw usname grname 0 sep 12 11:10 mypipe Modification des permissions d'accès jupiter% chmod g+rw mypipe jupiter% ls -l mypipe prw-rw usname grname 0 sep 12 11:12 mypipe Remarque : p indique que c est un tube. Une fois le tube créé, il peut être utilisé pour réaliser la communication entre deux processus. Chacun des deux processus ouvre le tube, l un en mode écriture et l autre en mode lecture. Chapitre
26 Les tubes nommés (3) Exemple 5 : programme writer // programme writer.c envoie un message sur le tube mypipe #include <unistd.h> #include <stdio.h> #include <fcntl.h> int main() { int fd; char message[100]; sprintf(message, "bonjour du writer [%d]", getpid()); //Ouverture du tube mypipe en mode écriture fd = open("mypipe", O_WRONLY); printf("ici writer[%d] \n", getpid()); if (fd!=-1) { // Dépot d un message sur le tube write(fd, message, strlen(message)+1); else printf( " désolé, le tube n'est pas disponible \n"); close(fd); return 0; Chapitre Les tubes nommés (4) Exemple 5 : programme reader // programme reader.c lit un message à partir du tube mypipe #include <unistd.h> #include <stdio.h> #include <fcntl.h> int main() { int fd,n; char message[100]; // ouverture du tube mypipe en mode lecture fd = open("mypipe", O_RDONLY); printf("ici reader[%d] \n",getpid()); if (fd!=-1) { // récupérer un message du tube, taille maximale est 100. while ((n = read(fd,message,100))>0) // n est le nombre de caractères lus printf("%s\n", message); else printf( "désolé, le tube n'est pas disponible\n"); close(fd); return 0; Chapitre
27 Les tubes nommés (5) Exécution des programmes writer et reader Après avoir compilé séparément les deux programmes, il est possible de lancer leurs exécutions en arrière plan. Les processus ainsi créés communiquent via le tube de communication mypipe. jupiter% gcc -o writer jupiter% gcc -o reader writer.c reader.c Lancement de l exécution d un writer et d un reader : jupiter% writer& reader& [1] 1156 [2] 1157 ici writer[1156] ici reader[1157] bonjour du writer [1156] [2] Done reader [1] + Done writer Chapitre Les tubes nommés (6) Exécution des programmes writer et reader Lancement de l exécution de deux writers et d un reader. jupiter% writer& writer& reader& [1] 1196 [2] 1197 [3] 1198 ici writer[1196] ici writer[1197] ici reader[1198] bonjour du writer [1196] bonjour du writer [1197] [3] Done reader [2] + Done writer [1] + Done writer Chapitre
28 Les tubes nommés (7) Quelques précisions Par défaut, l ouverture d un tube nommé est bloquante (spécifier O_NONBLOCK sinon). Si un processus ouvre un tube nommé en lecture (resp. écriture) alors qu il n y a aucun processus qui ait fait une ouverture en écriture (resp. lecture). -> le processus sera bloqué jusqu à ce qu un processus effectue une ouverture en écriture (resp. en lecture). Attention au situation d interblocage /* processus 1 */ /* processus 2 */ int f1, f2; int f1, f2;.... f1 =open("fifo1", O_WRONLY); f2=open("fifo2", O_WRONLY); f2 =open("fifo2", O_RDONLY); f1=open("fifo1", O_RDONLY);... Chapitre Les tubes de communication de Windows Tubes anonymes //ChildAnonymous.cpp (le programme exécuté par le fils) #include <windows.h> #define BUFSIZE 4096 VOID main(void) { CHAR chbuf[bufsize]; DWORD dwread, dwwritten; HANDLE hstdin, hstdout; BOOL fsuccess; hstdout = GetStdHandle(STD_OUTPUT_HANDLE); hstdin = GetStdHandle(STD_INPUT_HANDLE); Récupérer les handles de l entrée et de la sortie standards courantes if ((hstdout == INVALID_HANDLE_VALUE) (hstdin == INVALID_HANDLE_VALUE)) ExitProcess(1); Chapitre
29 Les tubes de communication de Windows (2) Tubes anonymes STDIN Fils STDOUT for (;;) { // Read from standard input. fsuccess = ReadFile(hStdin, chbuf, BUFSIZE, &dwread, NULL); if (! fsuccess dwread == 0) break; // Write to standard output. fsuccess = WriteFile(hStdout, chbuf, dwread, &dwwritten, NULL); if (! fsuccess) break; // Fin du programme exécuté par le fils Chapitre Les tubes de communication de Windows (3) Tubes anonymes //ParentAnonymous.cpp #include <windows.h> #include <stdio.h> #define BUFSIZE 4096 (programme exécuté par le père) HANDLE hchildstdinrd, hchildstdinwr, hchildstdoutrd, hchildstdoutwr, hinputfile, hstdout, hstderr; BOOL CreateChildProcess(VOID); VOID WriteToTube(VOID); VOID ReadFromTube(VOID); VOID ErrorExit(LPTSTR); Paramètre du programme = Nom de fichier DWORD main(int argc, char *argv[]) { SECURITY_ATTRIBUTES saattr; BOOL fsuccess; Chapitre
30 Les tubes de communication de Windows (4) Tubes anonymes // Initialisation de SECURITY_ATTRIBUTES. saattr.nlength = sizeof(security_attributes); saattr.binherithandle = TRUE; saattr.lpsecuritydescriptor = NULL; // récupérer le handle du STDOUT actuel. hstdout = GetStdHandle(STD_OUTPUT_HANDLE); Le fils va hériter certains handles du père La création d un premier tube de taille par défaut. // Créer un tube pour le STDOUT du processus enfant. if (! CreateTube(&hChildStdoutRd, &hchildstdoutwr, &saattr, 0)) ErrorExit("Stdout tube creation failed\n"); // Le processus enfant a juste besoin d écrire sur le tube STDOUT. // Ne pas lui faire hériter son handle de lecture SetHandleInformation( hchildstdoutrd, HANDLE_FLAG_INHERIT, 0); // Créer un tube pour le STDOUT du processus enfant. if (! CreateTube(&hChildStdinRd, &hchildstdinwr, &saattr, 0)) La création d un ErrorExit("Stdin tube creation failed\n"); second tube de // Le processus enfant a juste besoin de lire sur le tube STDIN. taille par défaut. // Ne pas lui faire hériter son handle d écriture. SetHandleInformation( hchildstdinwr, HANDLE_FLAG_INHERIT, 0); Chapitre Les tubes de communication de Windows (5) Tubes anonymes // Get the handle to the current STDERR. hstderr = GetStdHandle(STD_ERROR_HANDLE); // Créer le processus enfant. fsuccess = CreateChildProcess(); if (! fsuccess) ErrorExit("Create process failed with"); // Chercher un handle pour le fichier de lecture (passé en argument). if (argc == 1) ErrorExit("Please specify an input file"); printf( "Debug: argv[1] = %s\n", argv[1]); hinputfile = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (hinputfile == INVALID_HANDLE_VALUE) ErrorExit("CreateFile failed"); // Ecrire sur le tube qui possède le STDIN du processus enfant. WriteToTube(); // Lire du le tube qui possède le STDOUT du processus enfant. ReadFromTube(); return 0; Chapitre
31 Les tubes de communication de Windows (6) Tubes anonymes BOOL CreateChildProcess() { PROCESS_INFORMATION piprocinfo; STARTUPINFO sistartinfo; BOOL bfuncretn = FALSE; // Initialiser la structure PROCESS_INFORMATION. ZeroMemory( &piprocinfo, sizeof(process_information) ); // Initialiser la structure STARTUPINFO. ZeroMemory( &sistartinfo, sizeof(startupinfo) ); sistartinfo.cb = sizeof(startupinfo); sistartinfo.hstderror = hstderr; sistartinfo.hstdoutput = hchildstdoutwr; sistartinfo.hstdinput = hchildstdinrd; sistartinfo.dwflags = STARTF_USESTDHANDLES; STDOUT du fils sera le premier tube. STDERR du fils sera STDIN du fils sera le second tube Chapitre Les tubes de communication de Windows (7) Tubes anonymes // Créer le processus enfant. bfuncretn = CreateProcess(NULL, "child", // commande en ligne l executable NULL, // attributs de sécurité du processus NULL, // attributs de sécurité du thread primaire TRUE, // les handles sont héritées 0, // créations de flags NULL, // utiliser l environnement du parent NULL, // utiliser le directoire du parent &sistartinfo, // pointeur vers STARTUPINFO &piprocinfo); // reçoit PROCESS_INFORMATION if (bfuncretn == 0) ErrorExit("CreateProcess failed\n"); else { CloseHandle(piProcInfo.hProcess); CloseHandle(piProcInfo.hThread); return bfuncretn; Chapitre
32 Les tubes de communication de Windows (8) Tubes anonymes VOID WriteToTube(VOID) { DWORD dwread, dwwritten; CHAR chbuf[bufsize]; // Lire le fichier et envoyer son contenu sur le tube. for (;;) { if (! ReadFile(hInputFile, chbuf, BUFSIZE, &dwread, NULL) dwread == 0) break; if (! WriteFile(hChildStdinWr, chbuf, dwread, &dwwritten, NULL)) break; // Fermer le handle d écriture pour que le proc enfant arrête de lire. if (! CloseHandle(hChildStdinWr)) ErrorExit("Close tube failed\n"); Chapitre Les tubes de communication de Windows (9) Tubes anonymes VOID ReadFromTube(VOID) { DWORD dwread, dwwritten; CHAR chbuf[bufsize]; // Fermer le handle d écriture. if (!CloseHandle(hChildStdoutWr)) ErrorExit("Closing handle failed"); // Lire le output du processus enfant et afficher sur le STDOUT. for (;;) { if(!readfile( hchildstdoutrd, chbuf, BUFSIZE, &dwread, NULL) dwread == 0) break; if (! WriteFile(hStdout, chbuf, dwread, &dwwritten, NULL)) break; Chapitre
33 Les tubes de communication de Windows (10) Tubes anonymes VOID ErrorExit (LPTSTR lpszmessage) { fprintf(stderr, "%s\n", lpszmessage); ExitProcess(0); Fichier en paramètre STDIN =Clavier Pere Tube 2 STDIN Fils STDERR =Écran STDOUT + STDERR = Écran Tube 1 STDOUT Chapitre Les tubes de communication de Windows (11) Tubes nommés //ServerNamed.cpp #include <windows.h> #include <stdio.h> #include <tchar.h> #define BUFSIZE 4096 VOID InstanceThread(LPVOID); VOID GetAnswerToRequest(LPTSTR, LPTSTR, LPDWORD); int _tmain(void) { BOOL fconnected; DWORD dwthreadid; HANDLE htube, hthread; LPTSTR lpsztubename = TEXT("\\\\.\\tube\\mynamedtube"); Chapitre
34 Les tubes de communication de Windows (12) Tubes nommés htube = CreateNamedTube( lpsztubename, // nom du tube TUBE_ACCESS_DUPLEX, // accès read/write TUBE_TYPE_MESSAGE // tube de type-messages TUBE_READMODE_MESSAGE // mode message-read TUBE_WAIT, // mode bloquant TUBE_UNLIMITED_INSTANCES, // nb max. d instances BUFSIZE, // taille du output buffer BUFSIZE, // taille du input buffer NMPWAIT_USE_DEFAULT_WAIT, // time-out du client NULL); // sécurité par défault if (htube == INVALID_HANDLE_VALUE) { printf("createtube failed"); return 0; Chapitre Les tubes de communication de Windows (13) Tubes nommés else // Le client n a pu se connecter, fermer le tube. CloseHandle(hTube); return 1; VOID InstanceThread(LPVOID lpvparam) { TCHAR chrequest[bufsize]; TCHAR chreply[bufsize]; DWORD cbbytesread, cbreplybytes, cbwritten; BOOL fsuccess; HANDLE htube; // L argument du thread est un handle au tube. htube = (HANDLE) lpvparam; Chapitre
35 Les tubes de communication de Windows (14) Tubes nommés VOID InstanceThread(LPVOID lpvparam) { TCHAR chrequest[bufsize]; TCHAR chreply[bufsize]; DWORD cbbytesread, cbreplybytes, cbwritten; BOOL fsuccess; HANDLE htube; // L argument du thread est un handle au tube. htube = (HANDLE) lpvparam; while (1) { // Lire la requête du client à partir du tube. fsuccess = ReadFile( htube, // handle au tube chrequest, // buffer pour recevoir les données BUFSIZE*sizeof(TCHAR), // taille du buffer &cbbytesread, // numbre d octets lus NULL); // pas de overlapped I/O Chapitre Les tubes de communication de Windows (15) Tubes nommés if (! fsuccess cbbytesread == 0) break; GetAnswerToRequest(chRequest, chreply, &cbreplybytes); // Ecrire la réponse dans le tube. fsuccess = WriteFile( htube, // handle au tube chreply, // buffer dans lequel écrire cbreplybytes, // numbre d octets à écrire &cbwritten, // numbre d octets écrits NULL); // pas de overlapped I/O if (! fsuccess cbreplybytes!= cbwritten) break; // Flusher le tube, le déconnecter, puis fermer les handles. FlushFileBuffers(hTube); DisconnectNamedTube(hTube); CloseHandle(hTube); Chapitre
36 Les tubes de communication de Windows (16) Tubes nommés VOID GetAnswerToRequest( LPTSTR chrequest, LPTSTR chreply, LPDWORD pchbytes) { _tprintf( TEXT("%s\n"), chrequest ); lstrcpy( chreply, TEXT("Default answer from server") ); *pchbytes = (lstrlen(chreply)+1)*sizeof(tchar); Chapitre Les tubes de communication de Windows (17) Tubes nommés //ClientNamed.cpp #include <windows.h> #include <stdio.h> #include <conio.h> #include <tchar.h> #define BUFSIZE 512 int _tmain(int argc, TCHAR *argv[]) { HANDLE htube; LPTSTR lpvmessage = TEXT("Default message from client"); TCHAR chbuf[bufsize]; BOOL fsuccess; DWORD cbread, cbwritten, dwmode; LPTSTR lpsztubename = TEXT("\\\\.\\tube\\mynamedtube"); if( argc > 1 ) lpvmessage = argv[1]; // Essayer d ouvrir le tube nommé ou attendre qu il soit disponible. Chapitre
37 Les tubes de communication de Windows (18) Tubes nommés while (1) { htube = CreateFile( lpsztubename, // nom du tube GENERIC_READ // accès read et write GENERIC_WRITE, 0, // non partagé NULL, // sécurité par défault OPEN_EXISTING, // ouvrir un tube existant 0, // attributs par défault NULL); // pas de fichier template // Sortir si le handle n est pas valide. if (htube!= INVALID_HANDLE_VALUE) break; // Sortir si une erreur autre que ERROR_TUBE_BUSY survient. if (GetLastError()!= ERROR_TUBE_BUSY) { printf("could not open tube"); return 0; // Attendre 20 secondes, toutes les instances sont occupées. if (!WaitNamedTube(lpszTubename, 20000)) { printf("could not open tube"); return 0; Chapitre Les tubes de communication de Windows (19) Tubes nommés // Attendre qu un client se connecte. fconnected = ConnectNamedTube(hTube, NULL)? TRUE : (GetLastError() == ERROR_TUBE_CONNECTED); if (fconnected) // Créer un thread pour servir ce client. { hthread = CreateThread( NULL, // pas de sécurité 0, // taille du stack par défault (LPTHREAD_START_ROUTINE) InstanceThread, //nom fct thread (LPVOID) htube, // argument du thread 0, // non suspendue &dwthreadid); // thread ID if (hthread == NULL) { printf("createthread failed"); return 0; else CloseHandle(hThread); else // Le client n a pu se connecter, fermer le tube. CloseHandle(hTube); return 1; Chapitre
LEs processus coopèrent souvent pour traiter un même problème. Ces
Chapitre 5 Communication interprocessus LEs processus coopèrent souvent pour traiter un même problème. Ces processus s exécutent en parallèle sur un même ordinateur (monoprocesseur ou multiprocesseurs)
Cours 6 : Tubes anonymes et nommés
Cours 6 : Tubes anonymes et nommés Mécanisme de communications du système de fichiers I-node associé. Type de fichier: S_IFIFO. Accès au travers des primitives read et write. Les tubes sont unidirectionnels
Programmation système en C/C++
Programmation système en C/C++ Jean-Baptiste Vioix ([email protected]) LE2I - ENESAD http://jb.vioix.free.fr 1-41 Programmation en C/C++ sous Unix Il existe des très nombreux outils de développement sous
Introduction aux Systèmes et aux Réseaux
Introduction aux Systèmes et aux Réseaux Cours 5 Processus D après un cours de Julien Forget (univ Lille1) Laure Gonnord http://laure.gonnord.org/pro/teaching/ [email protected] Master CCI -
Cours Programmation Système
Cours Programmation Système Filière SMI Semestre S6 El Mostafa DAOUDI Département de Mathématiques et d Informatique, Faculté des Sciences Université Mohammed Premier Oujda [email protected] Février
Programmation système de commandes en C
Programmation système de commandes en C Cours de Programmation système Tuyêt Trâm DANG NGOC Université de Cergy-Pontoise 2012 2013 Tuyêt Trâm DANG NGOC Programmation système de commandes
Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace
Processus 1) Contexte 2) Modèles de Notion de Points de vue Modèle fourni par le SX Opérations sur les 3) Gestion des Représentation des Opérations 4) Ordonnancement des Niveaux d ordonnancement Ordonnancement
TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique
Communications entre Processus Communication par tubes. TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique Exemple 1: On a deux processus Père/Fils. Le père
3IS - Système d'exploitation linux - Programmation système
3IS - Système d'exploitation linux - Programmation système 2010 David Picard Contributions de : Arnaud Revel, Mickaël Maillard [email protected] Environnement Les programmes peuvent être exécutés dans des
Programmation système I Les entrées/sorties
Programmation système I Les entrées/sorties DUT 1 re année Université de Marne La vallée Les entrées-sorties : E/O Entrées/Sorties : Opérations d échanges d informations dans un système informatique. Les
Les processus. Système L3, 2014-2015 1/39
Les processus Système L3, 2014-2015 1/39 Les processus Processus = Instance d un programme en cours d exécution plusieurs exécutions de programmes plusieurs exécutions d un même programme plusieurs exécutions
École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.
École Polytechnique de Montréal Département de Génie Informatique et Génie Logiciel Cours INF2610 Contrôle périodique Automne 2013 Date : 11 octobre 2013 de 18h à 20h Professeur : Boucheneb Hanifa Documentation
Exécutif temps réel Pierre-Yves Duval (cppm)
Exécutif temps réel Pierre-Yves Duval (cppm) Ecole d informatique temps réel - La Londes les Maures 7-11 Octobre 2002 Plan Exécutif Tâches Evénements et synchronisation Partage de ressources Communications
GESTION DES FICHIERS C/UNIX
Licence IG Page 1 sur 6 GESTION DES FICHIERS C/UNIX Introduction Deux modes d appel - Par la bibliothèque standard C (appel de haut niveau) - Par appels système (bas niveau) Nécessite les includes suivant
Le système de gestion des fichiers, les entrées/sorties.
Le système de gestion des fichiers, les entrées/sorties. Luigi Santocanale Laboratoire d Informatique Fondamentale, Centre de Mathématiques et Informatique, 39, rue Joliot-Curie - F-13453 Marseille 19
Cours de Systèmes d Exploitation
Licence d informatique Synchronisation et Communication inter-processus Hafid Bourzoufi Université de Valenciennes - ISTV Introduction Les processus concurrents s exécutant dans le système d exploitation
Cours de S.E. les Signaux
Cours de S.E. les Signaux A. Dragut Univ. Aix-Marseille, IUT Aix en Provence 2012 A. Dragut Cours de S.E. les Signaux 1 / 76 Plan notion noms et numéros kill() effets de l arrivée des signaux Dynamique
Qu'est-ce qu'un processus: Définitions
Version septembre 2013 N 187 Qu'est-ce qu'un processus: Définitions Instruction = indécomposable et indivisible Processeur =... Processus = suite temporelle d'exécutions d'instructions Processus = exécution
Programmation système
Programmation système Christine Solnon Table des matières 1 Les processus 2 1.1 Etats d un processus................................... 2 1.2 Descripteur d un processus (PCB)...........................
Le prototype de la fonction main()
Le prototype de la fonction main() 1. Introduction...1 2. Paramètres et type de retour de la fonction main()...1 3. Exemple 1...2 4. La fonction exit() du C...2 5. Détecter le code de retour d un programme
ENSP Strasbourg (Edition 2009-2010) Les Systèmes Temps Réels - Ch. DOIGNON. Chapitre 3. Mise en œuvre : signaux, gestion du temps et multi-activités
Chapitre 3 Mise en œuvre : signaux, gestion du temps et multi-activités 77 GENERALITES SUR LES SIGNAUX Un signal est une information de contrôle (requête) transmise à un processus par un autre processus
Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.
Programmation système II Socket UNIX, Terminaux, Async IO, Mémoire, ELF Timothée Ravier LIFO, INSA-CVL, LIPN 1 re année cycle ingénieur STI 2013 2014 Plan global 1 Socket UNIX 2 Terminaux 3 Autres modèles
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)
Se souvenir 1(1)/54 Le système de fichiers (exemple du disque dur) Qu est-ce qu un processus? 3(3)/54 Les caches (inodes et blocks) Accès à un fichier : double indirection Compteurs de références : Les
03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing
3/4/27 Programmation Avancée Multimédia Multithreading Benoît Piranda Équipe SISAR Université de Marne La Vallée Besoin Programmes à traitements simultanés Réseau Réseau Afficher une animation en temps
REALISATION d'un. ORDONNANCEUR à ECHEANCES
REALISATION d'un ORDONNANCEUR à ECHEANCES I- PRÉSENTATION... 3 II. DESCRIPTION DU NOYAU ORIGINEL... 4 II.1- ARCHITECTURE... 4 II.2 - SERVICES... 4 III. IMPLÉMENTATION DE L'ORDONNANCEUR À ÉCHÉANCES... 6
Unix : Programmation Système
Département Informatique Année Universitaire 2004/2005 1 Compilation et programmation...6 1.1 Préparation du fichier source...6 1.1.1 L'éditeur vi (mode console)...6 1.1.2 L'éditeur nedit ou xedit (sous
Simulation d un système de paiement par carte bancaire
Simulation d un système de paiement par carte bancaire Mini projet IN301/IN3ST01-2009-2010 Sujet rédigé par Jean Cousty et Laurent Najman, très librement inspiré d un projet de Jérome Gueydan pour l ENSTA
Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.
I Présentation : Dans le chapitre 1, nous avons vu comment utiliser les appels-systèmes de bas niveau pour créer et accéder à des fichiers sur le disque. Nous avons notamment mis en évidence leur dépouillement
Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples
Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation impérative et structures de données simples Introduction au langage C Sandrine Blazy - 1ère année 24 octobre 2007 Cours d Algorithmique-Programmation
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.
1. Structure d un programme C Un programme est un ensemble de fonctions. La fonction "main" constitue le point d entrée pour l exécution. Un exemple simple : #include int main() { printf ( this
Le langage C. Séance n 4
Université Paris-Sud 11 Institut de Formation des Ingénieurs Remise à niveau INFORMATIQUE Année 2007-2008 Travaux pratiques d informatique Le langage C Séance n 4 But : Vous devez maîtriser à la fin de
Cours de Système : Gestion de Fichiers
Cours de Système : Gestion de Fichiers Bertrand Le cun et Emmanuel Hyon bertrand.le cun{at}u-paris10.fr et Emmanuel.Hyon{at}u-paris10.fr Université Paris Ouest Nanterre 25 octobre 2011 B.L.C. & E.H. (UPO)
Les processus légers : threads. Système L3, 2014-2015 1/31
Les processus légers : threads Système L3, 2014-2015 1/31 Les threads Les threads sont des processus légers exécutés à l intérieur d un processus L exécution des threads est concurrente Il existe toujours
Structure d un programme
Architecture des ordinateurs Cours 6 Structure d un programme 3 décembre 2012 Archi 1/30 Programme en Assembleur Archi 2/30 Sections de données programme en assembleur = fichier texte (extension.asm) organisé
Licence ST Université Claude Bernard Lyon I LIF1 : Algorithmique et Programmation C Bases du langage C 1 Conclusion de la dernière fois Introduction de l algorithmique générale pour permettre de traiter
EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE
EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE QCM Remarque : - A une question correspond au moins 1 réponse juste - Cocher la ou les bonnes réponses Barème : - Une bonne réponse = +1 - Pas de réponse = 0
Algorithmique et Programmation, IMA
Algorithmique et Programmation, IMA Cours 2 : C Premier Niveau / Algorithmique Université Lille 1 - Polytech Lille Notations, identificateurs Variables et Types de base Expressions Constantes Instructions
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)
1/4 Objectif de ce cours /4 Objectifs de ce cours Introduction au langage C - Cours Girardot/Roelens Septembre 013 Du problème au programme I passer d un problème exprimé en français à la réalisation d
Introduction au langage C
Introduction au langage C Cours 1: Opérations de base et premier programme Alexis Lechervy Alexis Lechervy (UNICAEN) Introduction au langage C 1 / 23 Les premiers pas Sommaire 1 Les premiers pas 2 Les
Introduction à la Programmation Parallèle: MPI
Introduction à la Programmation Parallèle: MPI Frédéric Gava et Gaétan Hains L.A.C.L Laboratoire d Algorithmique, Complexité et Logique Cours du M2 SSI option PSSR Plan 1 Modèle de programmation 2 3 4
Problèmes liés à la concurrence
ENS Cachan Problématique Difficile de gérer la concurrence : Pas toujours facile d avoir des fonctions réentrantes. Risque de race condition : ex : x :=x+1 x :=x+1 On voudrait des blocs d instructions
Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)
Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée) Propriétés Description Intitulé long Formation concernée Matière Présentation Développement d un logiciel de messagerie
ARDUINO DOSSIER RESSOURCE POUR LA CLASSE
ARDUINO DOSSIER RESSOURCE POUR LA CLASSE Sommaire 1. Présentation 2. Exemple d apprentissage 3. Lexique de termes anglais 4. Reconnaître les composants 5. Rendre Arduino autonome 6. Les signaux d entrée
SYSTÈME DE GESTION DE FICHIERS
SYSTÈME DE GESTION DE FICHIERS - DISQUE 1 Les couches logiciels réponse requête Requêtes E/S Système E/S Pilote E/S Interruptions utilisateur traitement S.E. commandes S.E. S.E. matériel Contrôleur E/S
Le traitement du temps
Programmation Système Mesure Horloges Sommeil Mise en forme Fabrice Harrouet École Nationale d Ingénieurs de Brest [email protected] http://www.enib.fr/~harrouet/ enib, F.H... 1/30 Intérêt Cadencer les
Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;
CNAM NFP121 TP 10 19/11/2013 (Séance 5) Objectif Manipuler les exceptions ; 1 Entrées/sorties Exercice 1 : Lire un entier à partir du clavier Ajouter une méthode readint(string message) dans la classe
INTRODUCTION A JAVA. Fichier en langage machine Exécutable
INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du
Architecture d un système d exploitation
Architecture d un système d exploitation 1/71 Architecture d un système d exploitation Jean-Claude Bajard IUT de Montpellier, Université Montpellier 2 Première année de DUT Architecture d un système d
INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores
INTRODUCTION AUX SYSTEMES D EXPLOITATION TD2 Exclusion mutuelle / Sémaphores Exclusion mutuelle / Sémaphores - 0.1 - S O M M A I R E 1. GENERALITES SUR LES SEMAPHORES... 1 1.1. PRESENTATION... 1 1.2. UN
TP : Gestion d une image au format PGM
TP : Gestion d une image au format PGM Objectif : L objectif du sujet est de créer une classe de manipulation d images au format PGM (Portable GreyMap), et de programmer des opérations relativement simples
OS Réseaux et Programmation Système - C5
OS Réseaux et Programmation Système - C5 Rabie Ben Atitallah [email protected] RPC - XDR Rappel RPC: Remote Procedure Call Besoin d un environnement de haut niveau pour le développement
Compression de Données - Algorithme de Huffman Document de Conception
ROLLET Samuel SALLE Jennifer Compression de Données - Algorithme de Huffman Document de Conception Projet d'algorithmique et Structure des Données 1 SOMMAIRE 1. Domaine d application....4 1.1 Objectifs
Formation Technicien Supérieur de Support en Informatique T2SI. Le module LINUX. Session 2012-2013 J04 Version 01
Formation Technicien Supérieur de Support en Informatique T2SI Le module LINUX Session 2012-2013 J04 Version 01 Christian DELAIR [email protected] GRETA / GITA Formation continue au Lycée polyvalent
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 (en C sous linux) Rémy Malgouyres LIMOS UMR 6158, IUT département info Université Clermont 1, B.P. 86 63172 AUBI Une version PDF de ce document est téléchargeable sur mon site web,
Le système GNU/Linux IUP NTIC2-1013 - 17/11/05
Capocchi Laurent Doctorant en Informatique [email protected] http://spe.univ-corse.fr/capocchiweb Objectifs Comprendre les notions de noyau Linux et des modules. Le système GNU/Linux IUP NTIC2-1013
IV- Comment fonctionne un ordinateur?
1 IV- Comment fonctionne un ordinateur? L ordinateur est une alliance du hardware (le matériel) et du software (les logiciels). Jusqu à présent, nous avons surtout vu l aspect «matériel», avec les interactions
INITIATION AU LANGAGE C SUR PIC DE MICROSHIP
COURS PROGRAMMATION INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC page 1 / 7 INITIATION AU LANGAGE C SUR PIC DE MICROSHIP I. Historique du langage C 1972 : naissance du C dans les laboratoires BELL par
Programmation impérative
Programmation impérative Cours 4 : Manipulation des fichiers en C Catalin Dima Organisation des fichiers Qqs caractéristiques des fichiers : Nom (+ extension). Chemin d accès absolu = suite des noms des
SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE
SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE C.Crochepeyre MPS_SGF 2000-20001 Diapason 1 Les couches logiciels réponse SGF requête matériel matériel Requêtes E/S Système E/S Pilote E/S Interruptions Contrôleur
Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Communication inter-processus (IPC) : tubes & sockets exemples en C et en Java F. Butelle F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Java : implémentation
Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7
Université Lumière Lyon 2 Faculté de Sciences Economiques et Gestion KHARKIV National University of Economic Introduction au Langage Java Master Informatique 1 ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin
IN 102 - Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C
IN 102 - Cours 1 Qu on le veuille ou non, les systèmes informatisés sont désormais omniprésents. Même si ne vous destinez pas à l informatique, vous avez de très grandes chances d y être confrontés en
Projet gestion d'objets dupliqués
Projet gestion d'objets dupliqués Daniel Hagimont [email protected] 1 Projet Service de gestion d'objets dupliqués Mise en cohérence lors de la prise d'un verrou sur un objet Pas de verrous imbriqués
Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier
Cours de C Petits secrets du C & programmation avancée Sébastien Paumier [email protected] Illustrations provenant du site http://tux.crystalxp.net/ 1 Affectations étendues a+=expression a=a+expression
Les chaînes de caractères
Les chaînes de caractères Dans un programme informatique, les chaînes de caractères servent à stocker les informations non numériques comme par exemple une liste de nom de personne ou des adresses. Il
Introduction à la programmation concurrente
Introduction à la programmation concurrente Moniteurs Yann Thoma Reconfigurable and Embedded Digital Systems Institute Haute Ecole d Ingénierie et de Gestion du Canton de Vaud This work is licensed under
Programmation C. Apprendre à développer des programmes simples dans le langage C
Programmation C Apprendre à développer des programmes simples dans le langage C Notes de cours sont disponibles sur http://astro.u-strasbg.fr/scyon/stusm (attention les majuscules sont importantes) Modalités
Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf
Introduction à Java Matthieu Herrb CNRS-LAAS http://homepages.laas.fr/matthieu/cours/java/java.pdf Mars 2014 Plan 1 Concepts 2 Éléments du langage 3 Classes et objets 4 Packages 2/28 Histoire et motivations
Les structures de données. Rajae El Ouazzani
Les structures de données Rajae El Ouazzani Les arbres 2 1- Définition de l arborescence Une arborescence est une collection de nœuds reliés entre eux par des arcs. La collection peut être vide, cad l
TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)
UE PC2R page 1/8 TD2/TME2 : Ordonnanceur et Threads (POSIX et fair) Exercice 1 (Modélisation) Chemin de Fer Cet exercice est dédié à l étude d un problème de circulation de trains : Voie! out1 in1 Voie!
Bases de programmation. Cours 5. Structurer les données
Bases de programmation. Cours 5. Structurer les données Pierre Boudes 1 er décembre 2014 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. Types char et
INTRODUCTION À LA PROGRAMMATION CONCURRENTE
INTRODUCTION À LA PROGRAMMATION CONCURRENTE POLYCOPIÉ DU COURS PCO1 Prof. Claude Evéquoz Prof. Yann Thoma HEIG-VD 2009 Table des matières Table des matières 2 1 Introduction à la programmation concurrente
1 Mesure de la performance d un système temps réel : la gigue
TP TR ENSPS et MSTER 1 Travaux Pratiques Systèmes temps réel et embarqués ENSPS ISV et Master TP1 - Ordonnancement et communication inter-processus (IPC) Environnement de travail Un ordinateur dual-core
6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, [email protected]
6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, [email protected] Interface d un SGF Implémentation d un SGF Gestion de la correspondance entre la structure logique et la structure
Gestion des processus
65 La Gestion des Processus 1 Définitions, exemples 2. Politiques d'allocation du processeur 3. Synchronisation des processus 66 Programme : Un programme est une suite figée d'instructions, un ensemble
Systèmes d exploitation Gestion de processus
Systèmes d exploitation Gestion de processus SITE : http://www.sir.blois.univ-tours.fr/ mirian/ Systèmes d exploitation - Mírian Halfeld-Ferrari p. 1/5 Les processus, à quoi ça sert? À faire plusieurs
Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs
Brefs rappels sur la pile et le tas (Stack / Heap) et les pointeurs (exemples en C) v1.11 - Olivier Carles 1 Pile et Tas Mémoire allouée de manière statique Mémoire Allouée Dynamiquement variables locales
Arguments d un programme
Arguments d un programme L2 SPI, Bruno Jacob 1 Arguments Quand on appelle un programme dans un environnement UNIX ou MS- DOS, on compose une ligne de commandes de la forme : nom-du-programme argument1
Lier Erlang avec d autres langages de programmation
16 Lier Erlang avec d autres langages de programmation Les logiciels actuels, quelle que soit leur taille, sont souvent écrits dans plusieurs langages de programmation. Généralement, les pilotes de périphériques
Initiation. àl algorithmique et à la programmation. en C
Initiation àl algorithmique et à la programmation en C Initiation àl algorithmique et à la programmation en C Cours avec 129 exercices corrigés Illustration de couverture : alwyncooper - istock.com Dunod,
COMPARAISONDESLANGAGESC, C++, JAVA ET
REPUBLIQUE DU BENIN *******@******* MINISTERE DE L ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUE(MESRS) *******@******* UNIVERSITE D ABOMEY CALAVI(UAC) *******@******* ECOLE POLYTECHNIQUE D ABPOMEY
Les structures. Chapitre 3
Chapitre 3 Les structures Nous continuons notre étude des structures de données qui sont prédéfinies dans la plupart des langages informatiques. La structure de tableau permet de regrouper un certain nombre
Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java
Info0101 Intro. à l'algorithmique et à la programmation Cours 3 Le langage Java Pierre Delisle, Cyril Rabat et Christophe Jaillet Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique
Playing with ptrace() for fun and profit
sous GNU/Linux [email protected] EADS Corporate Research Center - DCR/STI/C SSI Lab SSTIC 2006 Il était une fois... Sous UNIX, ptrace() est le seul moyen de debuggage. User-space, Interface rigide
I. Introduction aux fonctions : les fonctions standards
Chapitre 3 : Les fonctions en C++ I. Introduction aux fonctions : les fonctions standards A. Notion de Fonction Imaginons que dans un programme, vous ayez besoin de calculer une racine carrée. Rappelons
Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004
Questionnaire d'examen final INF1101 Sigle du cours Nom : Signature : Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004 Professeur(s)
Temps Réel. Jérôme Pouiller <[email protected]> Septembre 2011
Temps Réel Jérôme Pouiller Septembre 2011 Sommaire Problèmatique Le monotâche Le multitâches L ordonnanement Le partage de ressources Problèmatiques des OS temps réels J. Pouiller
Exercice sur les Dockers
Exercice sur les Dockers Les parties composant les Dockers: 1 docker daemon: est un démon qui gère les dockers (les conteneurs LXC) qui tournent sur la machine hôte 2 docker CLI: une série de commandes
Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail
Finalités Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail Réalisé par sa modestie Arnaud de VILLEDON de NAIDE, le 9 mars 2013 Document sous licence GPL. Vous avez le droit d'en faire
STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi 802.11 module
François SCHNEIDER Lycée Victor-Hugo BESANÇON. STS SE FreeRTOS Programmation réseau WIFI Programmation réseau Socket Tcp FlyPort smart Wi-Fi 802.11 module Prérequis : langage C, connaissance réseau : Ip,
Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :
Algorithmique et programmation : STRUCTURES DE DONNÉES A. Structure et enregistrement 1) Définition et rôle des structures de données en programmation 1.1) Définition : En informatique, une structure de
Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski [email protected]
Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski [email protected] Mars 2002 Pour Irène et Marie Legal Notice Copyright c 2002 Patrick Cégielski Université
Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1
Applications client/serveur TCP/IP - Sockets Rappels C.Crochepeyre Applications CS 1 PLAN Modèle client/serveur Modèle ISO et protocole TCP/IP Comment ça marche? La programmation: les sockets Exemples
MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année
2003-2004 Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES Maude Manouvrier La reproduction de ce document par
Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :
Développement d un client REST, l application Vélib 1. Présentation L application présentée permet de visualiser les disponibilités des vélos et des emplacements de parking à la disposition des parisiens
SUPPORT DE COURS. Langage C
Dpt Informatique 2010-2011 SUPPORT DE COURS Langage C Semestre 1 par : «CaDePe» Marie-Françoise Canut Marianne de Michiel André Péninou Table des Matières 1 Généralités...8 1.1 Introduction aux langages
Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs
Utilisation des classes de PourCGI par Michel Michaud, version 2002-11-23 Les fichiers PourCGI.h et PourCGI.cpp rendent disponibles deux classes et une fonction libre qui permettent de faire facilement
Communication sous UNIX les sockets
Communication sous UNIX les sockets Chaput Emmanuel Version 1.04 Résumé Ce but de ce petit document est de décrire la programmation des sockets sous Unix afin d aider le programmeur à développer des applications
Conventions d écriture et outils de mise au point
Logiciel de base Première année par alternance Responsable : Christophe Rippert [email protected] Introduction Conventions d écriture et outils de mise au point On va utiliser dans cette
Programmation C++ (débutant)/instructions for, while et do...while
Programmation C++ (débutant)/instructions for, while et do...while 1 Programmation C++ (débutant)/instructions for, while et do...while Le cours du chapitre 4 : le for, while et do...while La notion de
