Linux – Principes et Programmation 3. Communication inter-processus Tubes, IPC,

Linux – Principes et Programmation 3. Communication inter-processus Tubes, IPC, MSQ, SHM CNAM NSY103 2009/2010 Yann GAUTHERON Extraits : http://fr.wikipedia.org/, LINUX Programmation système et réseau (Joëlle DELACROIX), Unix: communications internes (C. Crochepeyre) http://www.cnam.fr/ Communication interne UNIX ●Communication Interne ● exec() ● Fichiers ● Signaux ● Tubes ● Doors (Solaris) ● IPC : Communication Inter Processus – MSQ : Files de messages – SHM : Mémoire partagée ●Communication Externe ● Sockets ● Moyens divers et variés pour échanges de données avec d'autres machines Communication interne UNIX ●exec() ● Commande Unix sous Shell et main() /usr/bin/ # prog a b c main(argc, argv, anvp) ● Paramètres d’appel – à l'exécution de main(argc, argv, envp) on récupère ●argc : le nombre de paramètres du 2ème paramètre ●argv : l'adresse d'un tableau d’adresses de chaînes de caractères sous Unix la première chaîne est le nom du programme (“prog”) ●envp : l'adresse d’un tableau d’adresses de chaînes de caractères donnant les valeurs des variables Shell Communication interne UNIX ●exec() ● Interface – main(argc, argv, envp) – int argc; – char **argv, **envp; ● argc : nombre d’éléments du tableau d’adresses pointé par argv ● argv : pointe sur le tableau qui contient les adresses des paramètres d’appel ● envp : pointe sur le tableau qui contient les adresses des variables d’environnement Communication interne UNIX ●exec() ● Exemple d’appel: – /usr/bin/ # prog par1 par2 par3 par4 avec variables d’environnement: TERM = vt100 HOME=/usr/moi ●La commande est composée de 5 paramètres ●main(argc, argv, envp) ●après exécution – argc = 5 – argv = adresse tableau contenant [“prog” “par1” “par2” “par3” “par4”] – envp = adresse tableau contenant [“TERM=vt100” ”HOME=/usr/moi”] Communication interne UNIX - Exemple de programme C Affichage des paramètres d'appel du programme lui-même : main(int argc, char **argv, char **envp) { int k; for(k=0;k<argc;++k) { printf("paramètres %d: %\n",k+1,argv[k]); argv[k]; } for(k=0;;++k) { if (envp[k][0]) printf("environnement %d: %\n",k+1,envp[k]); else break; } exit(0); } Communication interne UNIX - La variable d'environnement Unix : environ La variable 'environ' sous Unix est un pointeur sur un tableau de pointeurs vers les chaînes de caractères des variables d'environnement. Exemple : extern char **environ; main(){ int k; for(k=0;;++k) { if(environ[k][0]) printf("environnement %d: %\n",k+1,environ[k]); else break; } exit(0); } Communication interne UNIX ●Les tubes ou PIPE ● Deux types : – tube anonyme – tube nommé ● Moyen de communication entre deux processus s’exécutant sur une même machine ● Fichiers particuliers (SGF) ● Gérés par le noyau ● File de données en mémoire (FIFO) ● Lectures destructrices Les Tubes ●Les tubes anonymes ● Structure sans nom ● Communication entre deux processus ● Deux descripteurs: lecture et écriture ● Deux pointeurs automatiques: lecture et écriture – pointeur de lecture sur le 1er caractère non lu – pointeur d’écriture sur le 1er emplacement vide ● Processus de même filiation Les Tubes ●Les tubes anonymes Les Tubes ●Les tubes anonymes ● Principe de base père-fils – pipe(): création du tube par le père – fork(): création du processus fils – héritage de l’ouverture du tube (fichier) ● exec() – Passage des descripteurs en paramètres Les Tubes Les Tubes ●Les tubes anonymes Les Tubes ●Les tubes anonymes : caractéristiques ● L’ouverture du tube se fait par pipe() et non open() ● lseek() interdit ● taille limitée / taille du tampon alloué ● descripteurs de lecture fermés et tentative d’écriture – signal SIGPIPE – arrêt du processus ● lectures multiples: – le 1er qui lit récupère les données Les Tubes ●Les tubes anonymes : anomalies possibles ● (tube vide) && (lecture) – code erreur = 0 – processus bloqué jusqu’à dépôt de données ● (tube non vide) && (nombre de données à lire > données existantes) – code erreur = 0 – processus bloqué jusqu’à dépôt de données ● (tube plein) && (écriture) – code erreur = 0 – processus bloqué jusqu’à lecture de données ●Linux source : – x86: /include/linux/limits.h:13 #define PIPE_BUF 4096 – Arm: include/asm-arm/limits.h:8: #define PIPE_BUF PAGE_SIZE Les Tubes ●Les tubes anonymes : synchronisation Les Tubes ●Les tubes anonymes : synchronisation ● PA transmet à PB ou PB transmet à PA ● PA dépose et PA lit => PB bloqué ● PA et PB déposent et PB lit => risque que PB lise sa propre donnée Les Tubes ●Les tubes anonymes : synchronisation ● Modèle Question/Réponse : Fermeture des descripteurs inutiles Les Tubes ●Les tubes anonymes : Fonction tube ● pipe (tab) – crée un tube – retourne les n°des deux descripteurs dans un tableau ‘tab’ ●tab[0]: n°du descripteur de lecture: dl ●tab[1]: n°du descripteur d’écriture: de – remplit la fonction d’ouverture d’un fichier classique Les Tubes ●Les tubes anonymes : Exemple #include<stdio.h> Int pip[2];/* descripteur de pipe */ char buf[6]; main() { pipe(pip); /* création pipe */ switch(fork()){ case -1: perror("pipe"); exit(1); case 0: fils(); default: pere(); } pere() {write(pip[1],”hello”,5); exit(0);}/* écriture pipe */ fils() {read(pip[0],buf,5); exit(0);}/* lecture pipe */ } Les Tubes ●Les tubes anonymes : dup() Les Tubes ●Utilisation de dup() pour rediriger vers la sortie standard ● On crée un tube : – Les descripteurs 3 et 4 pointent vers la table des fichiers (ici le tube) ● On ferme le 1 – 1 est libre ● On duplique le 4 avec retour = dup(4) – 4 recopié dans 1 – Valeur de retour == nouveau descripteur, ici 1 ● On ferme 3 et 4 qui ne servent plus ● Tout envoi vers 1 concernera le tube Les Tubes ●Les tubes nommés ● Caractéristiques communes aux tubes anonymes : – communication entre processus s’exécutant sur une même machine – fichier particulier – file de messages en mémoire – pointeurs gérés automatiquement: lseek() inutilisable ● Différences : – fichier portant un nom – filiation non nécessaire – création par la fonction SGF mknod() – ouverture par open() – un seul descripteur par ouverture de tube – fichier persistant Les Tubes ●Les tubes nommés : synchronisation Les Tubes ●Les tubes nommés ● Fonction création SGF – mknod(nom,mode|S_FIFO) – mkfifo(nom,mode) ● Passage des descripteurs en paramètres – utilisation de la fonction de création d’un inode particulier – spécifier un nom de fichier – donner les droits d’accès – création d’un fichier fonctionnant en mode FIFO Les Tubes ●Les tubes nommés ● desc= open(nom_du_fichier, mode) – ouverture en lecture si mode = O_RDONLY – ouverture en écriture si mode = O_WRONLY – ouverture en maj si mode = O_RDWR – ouverture bloquante / non bloquante mode = O_NDELAY Les Tubes ●Les tubes nommés ● read(desc, buf, nb)lecture dans le tube – si O_NDELAY à l'ouverture ●retour code erreur si lecture dans un tube vide – sinon ●processus bloqué si tube vide, attente tube suffisamment de données à lire ● write(desc, buf, nb)écriture dans le tube – si O_NDELAY à l'ouverture ●retour code erreur si tube plein – sinon ●processus bloqué si tube plein, attente tube suffisamment vide pour écrire Les Tubes ●Les tubes nommés ● close(desc) – fermeture du descripteur du fichier ouvert dans chacun des processus ● Ou unlink(nom_du_fichier) – destruction du fichier ● Ou rm nom_du_fichier – commande shell de destruction du fichier Les Tubes ●Exemple d'utilisation des tubes nommés /* Processus ecrivain */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> main() { mode_t mode; int tub; mode = S_IRUSR | S_IWUSR; /* création fichier FIFO */ mkfifo("fictub",mode) /* ouverture fichier */ tub = open("fictub",O_WRONLY) /* écriture dans fichier */ write(tub,"0123456789",10); close(tub); exit(0); } Les Tubes ●Exemple d'utilisation des tubes nommés /* Processus lecteur */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> main() { int tub; char buf[11]; /* ouverture fichier */ tub = open("fictub",O_RDONLY); /* lecture du fichier */ read(tub,buf,10); buf[11]=0; printf("J'ai lu %s\n", buf); close(tub); exit(0); } Communication interne UNIX ●Les IPCs ● Externe au SGF ● Identification et manipulation par une clé ● Interface commun aux IPCs : – /usr/include/sys/ipc.h – /usr/include/sys/types.h ● Les IPCs : – Files de messages – Mémoire partagée – Sémaphores ● Commandes : – ipcs : voir un IPC – ipcrm : supprimer un IPC Les IPCs – Fichier types.h définitions des types /machine – Fichier ipc.h type def long mtyp_t; /* ipc type message */ struct ipc_perm { uid_t uid /* identification du propriétaire */ gid_t gid /* identification du groupe */ uid_t cuid /* identification du créateur */ gid_t uguid /* identification du groupe à la création */ mode_t mode /* mode d’accès */ ushort_t seq key_t key; /* clé*/ } Les IPCs ●Modes ● 00400 lecture par utilisateur ● 00200 écriture par utilisateur ● 00040 lecture par groupe ● 00020 écriture par groupe ● 00004 lecture par les autres ● 00002 écriture par les autres ●Variable Symbolique ● IPC_ALLOC 0100000 /* indicateur objet alloué */ ● IPC_CREAT 0001000 /* création si clé n’existe pas */ ● IPC_EXCL 0002000 /* échec si clé existe */ ● IPC_NOWAIT 0004000 /* erreur en cas d’attente */ Les IPCs ●Identifiant unique de type key_t ● Clé unique utile pour accéder à une ressource depuis plusieurs processus ● Valeur numérique pouvant exister de deux manières : – Figée dans le code source – Calculée par le système à uploads/Management/ nsy103-3-communication-inter-processus.pdf

  • 15
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Nov 01, 2021
  • Catégorie Management
  • Langue French
  • Taille du fichier 0.5601MB