04 - ipcbosio/HMEE209/CM_2015_2016/04 - ipc.pdf · Inter Process Communication sous UNIX/LINUX...
Transcript of 04 - ipcbosio/HMEE209/CM_2015_2016/04 - ipc.pdf · Inter Process Communication sous UNIX/LINUX...
12/11/14
1
1
Agenda
n Inter Process Communication sous UNIX/LINUX
Introduction
n On est capable de créer n processus n Comment échanger des données entre
processus ? n Comment le synchroniser ?
2
12/11/14
2
3
Introduction
wait
père fils
fork
Synchronisation
4
Introduction
wait
père fils
fork
père
fork
?
fils
12/11/14
3
Signals
n Software Interrupt n One signal is one event send to a process
n Error condition, illegal instruction, … n Used for communication between processes n signal.h defines signals name
SIGABORT Process abort SIGALARM Alarm clock SIGFPE FP exception SIGHUP Hangup SIGILL Illegal instruction SIGINT Terminal interrupt SIGKILL Kill (non maskerable) SIGPIPE Write on a pipe with no reader SIGQUIT Terminal quit SIGSEGV Invalid memory segment access SIGTERM Termination SIGUSR1 User-defined signal 1 SIGUSR2 User-defined signal 2 SIGCHLD Child process stopped or exited
12/11/14
4
kill
n Send (from the shell) one signal to a process: kill -SIGINT 123 n If the process has not been programmed
to manage the signal, then the process will be terminated
n Specify the signal handler
signal ( )
#include <signal.h> void (*signal (int sig, void (*func)(int)))(int);
n signal allows to set the signal handler n 2 parameters:
n sig: signal to capture n func: the function to execute when the signal is
received, the function has only one parameter int
12/11/14
5
signal ( )
n Two special signals n SIG_IGN: ignore the signal n SIG_DFL: use default handler
Exemple
n ./example/signal/ex1.c
12/11/14
6
kill ( )
#include <sys/types.h> #include <signal.h>
int kill (pid_t pid, int sig);
n Send a signal to one process n The two processes must have the same
UID
alarm ( )
#include <unistd.h> unsigned int alarm(unsigned int seconds);
n Send SIGALARM after seconds seconds
12/11/14
7
Exemple
n ./example/signal/ex2.c
PIPE (Tube)
n A PIPE corresponds to a data flow between two processes
n Each process uses one part of the pipe
P1 P2
12/11/14
8
pipe ( ) #include <unistd.h> int pipe (int fd[2]);
n fd contains the two file descriptor n fd[1] write to pipe n fd[0] read from pipe
n returns: n 0 OK n -1 Error
Fonctions read () write ()
n Réception des données n int read(int sockfd, char *buf, int count);
n read lit jusqu'à count octets depuis le descripteur de socket dans le buffer pointé par buf.
n read renvoie -1 s'il échoue, sinon read renvoie le nombre d'octets lus
16
12/11/14
9
Fonctions read () write ()
n Transmission des données n int write(int sockfd, char *buf, int count);
n write écrit jusqu'à count octets dans le fichier associé au descripteur sockfd depuis le buffer pointé par buf
n write renvoie le nombre d'octets écrits (0 signifiant aucune écriture), ou -1 s'il échoue.
17
Close ()
n int close(int id);
n close ferme le descripteur id, n close renvoie 0 s'il réussit, ou -1 en cas
d'échec
18
12/11/14
10
pipe & fork
n Childs processes have the same file descriptors of the father
n One pipe (open) allows the communication between father and child process
PIPE
n A PIPE corresponds to a data flow between two processes
n Each process uses one part of the pipe
P1 P2
12/11/14
11
PIPE
n A PIPE corresponds to a data flow between two processes
n Each process uses one part of the pipe
P1 P2
PIPE
n A PIPE corresponds to a data flow between two processes
n Each process uses one part of the pipe
P1 P2
P1 P2
12/11/14
12
Exemple
n ./example/pipe/ex1.c
23
24
Synchronisation avec Pipe
père
fork
read
write
fils
12/11/14
13
Exercice
n Exercice: n implémenter en langage C le
prog correspondant au schéma de synchronisation
25
père
fork
read
write
fils
Exercice
n Solution n ./example/pipe/ex2.c
26
père
fork
read
write
fils
12/11/14
14
Mémoire partagée
27
COD
E D
ATA
P1
Mémoire partagée
28
COD
E D
ATA
P1 fork()
12/11/14
15
Mémoire partagée
29
COD
E D
ATA
P1 fork()
COD
E D
ATA
P2
Mémoire partagée
30
…
…
…
…
…
P1 P2
Processes Queue
RAM
12/11/14
16
Mémoire partagée
n La mémoire partagée est la forme de IPC la plus rapide n tous les processus partagent la même
mémoire. n ne nécessite pas d'appel système.
31
Mémoire partagée
32
COD
E D
ATA
P1
COD
E D
ATA
P2
SHM
12/11/14
17
Mémoire partagée
33
…
…
…
P1 P2
Processes Queue
RAM
Mémoire partagée
n Utilisation n Allocation de la mémoire
n shmget!
n Attachement de la mémoire n Permet d’utiliser la mémoire partagée n shmat!
n De-allocation de la mémoire n shmctl!
34
12/11/14
18
Debug
n Command ipcs –m
IPC status from <running system> as of Thu Oct 11 10:39:13 CEST 2012!T ID KEY MODE OWNER GROUP!Shared Memory:!m 65536 0x0000162e --rw-rw-rw- albertobosio staff!
35
Exemple
36
n Program n ./example/shared_mem/exemple1.c
12/11/14
19
Mémoire partagée
37
Return
int shmget(key_t key, int size,int shmflg); Summary
2 Manual Section
<sys/ipc.h> <sys/shm.h>
Include File(s)
Sets errno Failure Success
Yes -1 Shared memory identifier.
Mémoire partagée
n int shmget(key_t key, int size,int shmflg); n Son premier paramètre est une clé entière qui
indique le segment à créer. n Des processus sans lien peuvent accéder au même
segment partagé en spécifiant la même valeur de clé, ce qui provoquerait un conflit.
n Utiliser la constante spéciale IPC_PRIVATE comme valeur de clé garantit qu'un nouveau segment mémoire est créé.
38
12/11/14
20
Mémoire partagée
n int shmget(key_t key, int size,int shmflg); n Le second paramètre indique le nombre d'octets
du segment.
39
Mémoire partagée n int shmget(key_t key, int size,int shmflg);
n Le troisième paramètre est un ou binaire entre des indicateurs décrivant les options demandées à shmget.
n IPC_CREAT : Demande la création d'un nouveau segment.
n IPC_EXCL : utilisé avec IPC_CREAT n Provoque l'échec de shmget si la clé de segment
spécifiée existe déjà. n Si cette option n'est pas précisée et que la clé d'un
segment existant est utilisé, shmget renvoie le segment existant au lieu d'en créer un nouveau.
40
12/11/14
21
Mémoire partagée n Indicateurs de mode : Cette valeur spécifie les permissions du
propriétaire, du groupe et des autres utilisateurs pour contrôler l'accès au segment
n Par exemple, S_IRUSR et S_IWUSR spécifient des permissions de lecture et écriture pour le propriétaire du segment de mémoire partagée et S_IROTH et S_IWOTH spécifient des permissions de lecture et écriture pour les autres utilisateurs.
shmget (IPC_PRIVATE, !shared_segment_size, !IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);!
41
Mémoire partagée
42
Return
int shmctl(int shmid, int cmd, struct shmid_ds *buf); Summary
2 Manual Section
<sys/ipc.h> <sys/shm.h>
Include File(s)
Sets errno Failure Success
Yes -1 0
12/11/14
22
Mémoire partagée
n Le premier paramètre est l'identifiant d'un segment de mémoire partagée.
n Pour obtenir des informations sur un segment de mémoire partagée, passez IPC_STAT comme second argument et un pointeur vers une struct shmid_ds.
n Pour supprimer un segment, passez IPC_RMID comme second argument et NULL comme troisième argument. Le segment est supprimé lorsque le dernier processus qui l'a attaché le détache.
43
Mémoire partagée
44
Return
void *shmat(int shmid, const void *shmaddr, int shmflg); Summary
2 Manual Section
<sys/ipc.h> <sys/shm.h>
Include File(s)
Sets errno Failure Success
Yes -1 Reference to the data segment
12/11/14
23
Mémoire partagée
n Première argument est l'identifiant de mémoire partagée SHMID renvoyé par shmget.
n Le second argument est un pointeur qui indique l’adresse mémoire que vous voulez associer à la mémoire partagée n NULL: Linux sélectionnera une adresse disponible.
45
Mémoire partagée
n Le troisième argument est un indicateur, qui peut prendre une des valeurs suivantes: n SHM_RDONLY indique que le segment sera
uniquement lu, pas écrit. n 0 lecture et ecriture
n Si l'appel se déroule correctement, il renvoie l'adresse du segment partagé attaché. n Les processus fils créés par des appels à fork
héritent des segments partagés attachés; il peuvent les détacher s'ils le souhaitent.
46
12/11/14
24
Exemple
n /example/shared_mem n shm_server.c n shm_client.c
n /example/shared_mem n shm_server_fork_client.c
47