Académique Documents
Professionnel Documents
Culture Documents
ElBedoui 1
Tube anonyme : pipe
Mémoire partagée
Files de messages
Sockets
Mme. K. ElBedoui 2
• Caractéristiques
– Fichier :
• temporaire
• pas d’entrée dans le système de fichier
• destruction automatique à la fin de l’utilisation
• pas d’utilisation de : open()/ lseek()
• Utilisable uniquement par le processus et sa descendance
– Taille : bornée = 4 Ko (PIPE_BUF)
– Communication :
• Sens : unidirectionnel
• mode : flot continu de caractères (streaming)
• ordre : FIFO
• via deux opérations :
– Lecture : read ( ), destructive
– Écriture : write ( ),
Mme. K. ElBedoui 3
P[1] P[0]
écriture lecture
Mme. K. ElBedoui 4
P[1] P[0]
écriture lecture
Processus 1
Intérêt :
Aucun
Mme. K. ElBedoui 5
P[1] P[0]
écriture lecture
Processus 1
Processus 2
Intérêt :
Communication : échange des informations
Mme. K. ElBedoui 6
P[1] P[0]
écriture lecture
Mme. K. ElBedoui 7
• Utilisation typique
P[1] P[0]
écriture lecture
Mme. K. ElBedoui 8
• Utilisation typique
P[1] P[0]
écriture lecture
Mme. K. ElBedoui 9
• Utilisation typique
P[1] P[0]
écriture lecture
P[1]
écriture
Primitive
ssize_t write (int fd, const void *buffer, size_t nbyte);
Mme. K. ElBedoui 11
• Écriture
P[1]
écriture
Primitive
ssize_t write (int fd, const void *buffer, size_t nbyte);
P[0]
lecture
Primitive
ssize_t read (int fd, void *buffer, size_t nbyte);
Mme. K. ElBedoui 13
• Lecture
P[0]
lecture
Primitive
ssize_t read (int fd, void *buffer, size_t nbyte);
1
stdout
0
stdin
2
stderr
Mme. K. ElBedoui 16
• Redirection
• Trois descripteurs standards :
Ces descripteurs sont :
1
stdout
0
stdin
2
stderr
Mme. K. ElBedoui 17
• Redirection
• Trois descripteurs standards :
En cas de communication entre deux processus
Mme. K. ElBedoui 18
• Redirection
• Trois descripteurs standards :
Les informations peuvent être transmises via un pipe
pipe
Mme. K. ElBedoui 19
• Redirection
• Trois descripteurs standards :
Dans ce dernier cas, des redirections doivent être établies
pipe
Connexion de la Connexion de
sortie standard de l’entrée standard de
processus 1 vers processus 2 depuis le
le tube tube
Mme. K. ElBedoui 20
• Redirection
• Trois descripteurs standards :
Ces redirections sont réalisées par la primitive dup2
pipe
Mme. K. ElBedoui 21
• Redirection
• Motivation
• Affiner les résultats
• Utilité
$ commande1 | commande2
Mme. K. ElBedoui 22
• Exécution d’une commande
Sh Sh Sh
fork wait
père père père
Sh
fils
exec
exit
« commande » stdout
Mme. K. ElBedoui 23
• Exécution de deux commandes
wait
wait
fd
exec exec
commande1 commande2
exit exit
Mme. K. ElBedoui 24
• Limites
Mme. K. ElBedoui 25
• Caractéristiques
– Fichier :
• Il a une entrée dans le SGF
• Utilisable par tout processus connaissant son nom et ayant les droits
d’accès
– Communication :
• via deux opérations :
– Lecture : read ( ), destructive
– Écriture : write ( ),
Mme. K. ElBedoui 26
Mme. K. ElBedoui 27
Mme. K. ElBedoui 28
Mme. K. ElBedoui 29
Mme. K. ElBedoui 30
Mme. K. ElBedoui 31
Mme. K. ElBedoui 32
Mme. K. ElBedoui 33
!
Mme. K. ElBedoui 34
!
Mme. K. ElBedoui 35
fifo1
fifo2
Mme. K. ElBedoui 36
fifo1
fifo2
/* processus 1 */
fifo2
/* processus 1 */ /* processus 2 */
fifo2
/* processus 1 */ /* processus 2 */
fifo2
/* processus 1 */ /* processus 2 */
$ cat <Tube1
Bonjour
$
Mme. K. ElBedoui 41
fifo1 (question)
SIGUSR1
fifo2 (réponse)
Mme. K. ElBedoui 42
fifo1 (question)
SIGUSR1
fifo2 (réponse)
Codes
Mme. K. ElBedoui 43
Mme. K. ElBedoui 44
Mme. K. ElBedoui 45
Mme. K. ElBedoui 46
Code
Données
Pile
Mme. K. ElBedoui 47
Code
Données
•Adresses limites
•Pour éviter tout risque de chevauchement
Pile
Mme. K. ElBedoui 48
Nous pouvons étendre l’espace d’adressage d’un
processus via un segment de mémoire partagé
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
Mme. K. ElBedoui 49
RAM
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
Mme. K. ElBedoui 61
Int shmctl ( shmid, IPC_RMID, buffer)
Mme. K. ElBedoui 62
Int shmctl ( shmid, IPC_STAT, buffer)
Mme. K. ElBedoui 63
struct shmid_ds {
struct ipc_perm shm_perm;
/* Propriétaire et permissions */
int shm_segsz;
/* Taille segment en octets */
time_t shm_atime;
/* Heure dernier attachement */
time_t shm_dtime;
/* Heure dernier détachement */
Time_t shm_ctime;
/* Heure dernier changement */
unsigned short shm_cpid;
Int shmctl ( shmid, IPC_STAT, buffer) /* PID du créateur */
unsigned short shm_lpid;
/* PID du dernier shmat( )/shmdt( ) */
short shm_nattch;
/* Nombre d’attachements */
};
Mme. K. ElBedoui 64
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Mme. K. ElBedoui 65
typedef struct
#include <sys/types.h> {
#include <sys/ipc.h>
#include <sys/msg.h> int mtype;
char mtexte [256];
} message_t;
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Communication entre
un processus Emetteur et un processus Récepteur
Mme. K. ElBedoui 67
*mtype *mtype *mtype
*mtexte *mtexte * mtexte
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Communication entre
un processus Emetteur et plusieurs processus Récepteurs
Mme. K. ElBedoui 68
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Mme. K. ElBedoui 69
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Mme. K. ElBedoui 70
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Mme. K. ElBedoui 71
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Par défaut :
Mme. K. ElBedoui 72
000 -> pb
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
Mme. K. ElBedoui 87
struct msqid_ds {
struct ipc_perm msg_perm;
/* Propriétaire et permissions */
time_t msg_stime;
/* Heure du dernier msgsnd( ) */
time_t msg_rtime;
/* Heure du dernier msgrcv( ) */
time_t msg_ctime;
/* Heure de la dernière modification */
unsigned long __msg_cbytes;
/* Nombre actuel d’octets dans la file (non standard) */
msgqnum_t msg_qnum;
msgctl (msgid , IPC_STAT, buffer);
/* Nombre actuel de messages dans la file */
msglen_t msg_qbytes;
/* Nombre maximal d’octets autorisés dans la file */
pid_t msg_lspid;
/* PID du dernier msgsnd( ) */
pid_t msg_lrpid;
/* PID du dernier msgrcv( ) */
};
Mme. K. ElBedoui 88
pipe msg
Tubes IPC
shm
prise
Processus 1 Processus 2
Noyau
Communication entre
processus locaux
Mme. K. ElBedoui 89
Processus 1 Processus 2
Socket
Noyau Noyau
Communication entre
processus distants
Mme. K. ElBedoui 90
Une socket :
Processus 1 Processus 2
Socket
Noyau Noyau
Mme. K. ElBedoui 91
Utilisation typique :
Le client émet une requête vers le serveur accessible via son adresse
et le numéro de port qui désigne un service particulier du serveur
Mme. K. ElBedoui 92
Utilisation typique :
Mme. K. ElBedoui 93
Qu’est-ce qu’une adresse ?
Exemples :
Mme. K. ElBedoui 94
#include <sys/types.h>
#include <sys/socket.h>
Mme. K. ElBedoui 95
#include <sys/types.h>
#include <sys/socket.h>
Mme. K. ElBedoui 96
#include <sys/types.h>
#include <sys/socket.h>
Mme. K. ElBedoui 97
#include <sys/types.h>
#include <sys/socket.h>
• Autres protocoles
Mme. K. ElBedoui 99
#include <sys/types.h>
#include <sys/socket.h>
socket()
socket()
bind()
connect()
listen()
Connexion
accept()
send()
recv()
Données
send()
recv()
103
Mme. K. ElBedoui
close() close()
Client Serveur
socket()
socket()
bind()
sendto()
recvfrom()
recvfrom() sendto()
close() close()
Mme. K. ElBedoui 104
Mécanismes
#include <sys/types.h>
#include <sys/socket.h> /* socket(), bind() ... */
int socket
(
int domaine, /* AF_UNIX | AF_INET */
int type, /* SOCK_DGRAM | SOCK_STREAM */
int protocole /* 0 : protocole par défaut */
);
# include <arpa/inet.h>
char * inet_ntoa (struct in_addr in);
La chaîne est renvoyée dans un buffer alloué statiquement, qui est donc
écrasé à chaque appel.
Sur les architectures i386, l’ordre des octets est différent de celui des réseaux
comme Internet : l’octet de poids faible est placé en premier (on parle de LSB
pour Least Significant Byte first), alors que sur les réseaux, c’est l’octet de
poids fort en premier (on parle de MSB pour Most Significant Byte first).
Il est donc nécessaire d’utiliser les fonctions suivantes pour effectuer
correctement la conversion lors de la spécification des numéros de ports :
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <string.h> /* memcpy(), strcmp() */
#include <unistd.h>
#include <netdb.h> /* gethostbyname() */
#include <sys/types.h>
#include <sys/socket.h> /* socket(), connect(), bind(), ... */
#include <netinet/in.h> /* pour les sokets AF_INET, htonl(), etc. */
#include <arpa/inet.h> /* inet_ntoa() */