:tocdepth: 2 .. index:: IPC (inter-process communication) =============================== Communication inter-processus =============================== .. include:: common.rst.inc Introduction ============ Motivation ++++++++++ Malgré la généralité des mécanismes d'`entrée-sortie `:doc:, d'autres mécanismes peuvent être nécessaire pour faire communiquer des processus. Communication *via* la mémoire ============================== .. index:: mémoire partagée pair: appel système; shmget pair: appel système; shm_open .. _shm: Mémoire partagée ++++++++++++++++ * Rappel : le système assure que par défaut, chaque processus travaille dans une zone mémoire qui lui est propre (cf. séances sur l'allocation de mémoire) * L'appel système ``shmget`` permet d'obtenir un pointeur vers une zone mémoire partageable entre plusieurs processus (Linux) * L'appel système ``shm_open`` permet d'obtenir un descripteur de fichier (en accès aléatoire avec ``lseek``) vers une zone mémoire partageable (POSIX) .. index:: pair: appel système; mmap Combinaison avec ``mmap`` +++++++++++++++++++++++++ * Les descripteurs de fichiers retournés par ``shm_open`` peuvent ensuite être passés à ``mmap`` pour accéder à cette zone mémoire directement. * Peut sembler être un "détour" inutile et compliqués, mais ces deux appels systèmes peuvent aussi être utilisés seuls, donc ils ont chacun leur raison d'être. .. index:: signal Signaux ======= .. index:: signal pair: appel système; kill Définition : Signal +++++++++++++++++++ * Un **signal** est un événement logiciel, produit par le système à destination d'un processus * soit à la demande d'un autre processus (appel système ``kill``) * soit en réponse à un événement interne au système (interruption matérielle, erreur logicielle, etc...) .. index:: signal pair: appel système; signal pair: appel système; sigaction Utilisation ----------- * Il existe différents types de signaux (numéros) * Un programme peut associer une procédure à un signal (appels systèmes ``signal`` ou ``sigaction``) * L'action associée par défaut à la majorité des signaux est l'**arrêt** du processus * différent pour quelques signaux: ignoré, bloque ou débloque le processus... Signal et programmation événementielle -------------------------------------- * Les signaux sont un mécanisme pour faire de la `programmation événementielle `:ref: NB : ce n'est pas le seul... * Ils sont notamment une manière d'utiliser les entrées / sorties asynchrone : on peut demander à ``aio_read`` et ``aio_write`` d'émettre un signal lorsque l'opération est effectivement terminée. .. index:: pair: appel système; sleep Signaux entre processus ----------------------- Les signaux peuvent également être utilisés pour communiquer entre plusieurs processus de manière asynchrone * ``SIGUSR1`` et ``SIGUSR2`` réservés aux applications (i.e. pas de sémantique préfédinie, jamais envoyés par le système lui même) Ils peuvent notamment servir à la synchronisation * un processus attend (appel système ``sleep``) qu'un autre processus lui envoie un signal pour poursuivre son exécution .. index:: sémaphore pair: appel système; sem_post pair: appel système; sem_wait .. _sémaphore: Sémaphore ========= Sémaphore +++++++++ Ressource servant à la synchronisation * notion inventée par `Edsger W. Dijkstra`__ __ http://fr.wikipedia.org/wiki/Edsger_Dijkstra Analogie à une pile de jetons * contient initialement un certain nombre de jetons * les processus peuvent poser (``sem_post``) ou prendre (``sem_wait``) un jeton * comme son nom, l'appel ``sem_wait`` peut être bloquant: lorsqu'un processus tente de prendre un jeton alors que la pile est vide, il se bloque en attendant qu'un jeton soit posé.