Académique Documents
Professionnel Documents
Culture Documents
processus, sockets
Viviane Gal
CNAM – Département Informatique/Laboratoire CEDRIC
• UNIX
Programmation et communication
Jean-Marie Rifflet, JeanBaptiste Yunès
Editions Dunod
• Cours "Introduction à la communication IPC Internet"
Eric Gressier-Soudan, CNAM-CEDRIC
• Programmation des sockets sous Unix
Hafid Bourzoufi et Didier Donsez – Université de Valenciennes
• Merci à Samia Bouzefrane
8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005
Unix : Communication inter
processus, sockets
• Introduction
• Les sockets
• Entrées/sorties
– A chaque fichier Unix : i-nœud ou nœud d’index avec
ensemble de caractéristiques du fichier
• Caractéristiques communes
• Mécanismes de communication
• A priori unidirectionnels (1 entrée en lecture, 1 en écriture)
• Durant son existence possibilité 1 extrémité inaccessible
• La lecture est destructrice
• Communication d’un flot continue (stream par opposition à
datagramme)
• Gestion mode fifo
• Capacité limitée
• Comportement fonction du nombre de lecteurs et du nombre
d’écrivains
8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005
Les tubes anonymes (pipes)
Unix : communication inter processus, sockets
• Caractéristiques spécifiques
Compteur
références
p[0] internes
1 wr
Table des descripteurs Table des fichiers ouverts
du processus appelant Table des i-nœuds en mémoire
• Schéma du tube
tubeDesc[0]
tubeDesc[1]
read
write
où
tube[0] : descripteur en lecture
buf : pointeur sur TAILLE_BUF
nb_lu : nombre de caractères lus
où
tube[1] : descripteur en écriture
buffer : pointeur sur taillebuf
taillebuf : caractères accessibles
• Comment ça marche ?
si nbre lecteurs dans tube = 0
alors SIGPIPE délivré au processus écrivain ⇒ terminaison
processus
sinon
si écriture bloquante alors retour primitive vrai que si les n
caractères sont écrits et processus endormi jusqu’à
tube vide
sinon
si n > PIPE_BUF alors retour = nbre < n
si n ≤ PIPE_BUF et nbre emplacements libres ≥ n
alors écriture atomique
si n ≤ PIPE_BUF et nbre emplacements libres < n
alors retour immédiat sans écriture
(renvoi –1 et errno =
EAGAIN)
8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005
Les tubes anonymes (pipes)
Unix : communication inter processus, sockets
• Exercice : Ecriture dans un tube sans lecteur
/* usage : ecrivain sans lecteur */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
struct sigaction action;
void handSigpipe(int sig) { printf("Signal SIGPIPE reçu\n");}
main() {
int nbEcriture, tube[2];
action.sa_hendler = handSigpipe;
sigaction(SIGPIPE, &action, NULL);
pipe(tube); close(tube[0]);
if ((nbEcriture = write(tube[1], "A", 1)) == -1)
perror("Write");
else
printf("Retour du write : %d\n", nbEcriture);
}
8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005
Les tubes anonymes (pipes)
Unix : communication inter processus, sockets
switch (fork()) {
case -1 : perror("fork"); exit(1);
case 0 :
if ((desc=open(argv[1], O_WRONLY|O_CREAT, 0666))== -
1){
perror("open");
exit(2);
}
8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005
Les tubes anonymes (pipes)
Unix : communication inter processus, sockets
default : wait(NULL);
if ((desc2=open(argv[1],O_RDONLY))==-1)
{
perror("open"); exit(2); }
close(STDIN_FILENO);
dup(desc2);
close(desc2);
execlp("wc", "wc", "-l", NULL);
perror("execlp");
exit(1);
}
}
void main() {
int p[2];
action.sa_handler = capture;
sigaction(SIGPIPE,&action,NULL);
printf("Mon pid est %d\n", getpid());
pipe(p);
close(p[0]); /* fermer le descripteur du
tube en lecture */
ps –l | grep toto
$ mknod nom_tube p
• Mise en œuvre
$ mknod nom_tube p
$ script1 < tube & exécution en arrière-plan
$ script2 > tube
$ wait attente de la fin du script1
La fonction mkfifo
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *ref, mode_t mode);
• Caractéristiques principales
– Structure
Socket associée à objet de structure socket dans le fichier
<sys/socketvar.h>
– Type
• Détermine la sémantique des communications
• Associe un ensemble de propriétés (fiabilité, séquencement, …)
• Fichier standard <sys/socket.h> contient les définitions des
constantes symboliques
– Domaine
• Définit le format des adresses
• Définit un ensemble de protocoles
• Certains domaines prédéfinis se trouvent dans le fichier
<sys/socket.h>
• Exemple de domaines
Nom symmbolique Domaine Format adresses
AF_UNIX ou AF_LOCAL Local sockaddr_un (fichier <sys/un.h>
AF_INET Internet sockaddr_in (fichier <netinet/in.h>
AF_NS Xerox NS Sockaddr_ns (fichier <netns/ns.h>
• Primitives générales
– Création d’une socket : socket
int socket(int domaine, int type, in protocole);
• Par datagrammes
Sockets du type SOCK_DGRAM
• En mode connecté
Socket du type SOCK_STREAM
• Opérations à réaliser
• Envoi de message
Appel de la fonction sendto
int sendto(int descripteur, void *message, int longueur, int option,
struct sockaddr *p_adresse, int lg_adresse);
La primitive sendmsg
int sendmsg(int descripteur, struct msghdr *msghdr, int option);
• Lecture de message
La primitive recvfrom
int recvfrom(int descripteur, void *message, int longueur, int option,
struct sockaddr *p_adresse, int p_lg_adresse);
La primitive recvmsg
int sendmsg(int socket struct msghdr *msghdr, int option);
• Pseudo-connexions
La primitive connect
• La primitive accept
int accept(int descripteur, struct sockaddr *ptr_adresse, int *p_lg);
Échec réussite
Dialogue avec le serveur
• Dialogue client/serveur
Entité Entité
TCP TCP
Tampon de réception Tampon d'émission
Réseau
physique
lecture
écriture Caractère urgent
socket
socket
La primitive shutdown
#include <sys/types.h>
#include<sys/socket.h>
int shutdown(int desc, int sens);