GNU/Linux >> Linux Esercitazione >  >> Linux

Presentazione della guida alla comunicazione tra processi in Linux

Far dialogare un processo software con un altro processo software è un delicato atto di bilanciamento. Tuttavia, può essere una funzione vitale per un'applicazione, quindi è un problema che qualsiasi programmatore che si imbarca in un progetto complesso deve risolvere. Se la tua applicazione deve dare il via a un lavoro gestito dal software di qualcun altro; monitorare un'azione eseguita da una periferica o su una rete; o per rilevare un segnale da qualche altra fonte, quando il tuo software fa affidamento su qualcosa al di fuori del proprio codice per sapere cosa fare dopo o quando farlo, devi pensare alla comunicazione interprocesso (IPC).

Più risorse Linux

  • Comandi Linux cheat sheet
  • Cheat sheet sui comandi avanzati di Linux
  • Corso online gratuito:Panoramica tecnica RHEL
  • Cheat sheet della rete Linux
  • Cheat sheet di SELinux
  • Cheat sheet dei comandi comuni di Linux
  • Cosa sono i container Linux?
  • I nostri ultimi articoli su Linux

Il sistema operativo Unix ne ha tenuto conto molto tempo fa, forse a causa di una precoce aspettativa che il software provenisse da fonti diverse. Nella stessa tradizione, Linux fornisce molte delle stesse interfacce per IPC e alcune nuove. Il kernel Linux presenta diversi metodi IPC e il pacchetto util-linux contiene ipcmk , ipcrm , ipc e lsipc comandi per il monitoraggio e la gestione dei messaggi IPC.

Mostra informazioni IPC

Prima di sperimentare con IPC, dovresti sapere quali strutture IPC sono già presenti sul tuo sistema. Il lsipc il comando fornisce tali informazioni.

RESOURCE DESCRIPTION               LIMIT  USED  USE%
MSGMNI   Number of message queues  32000     0 0.00%
MSGMAX   Max size of message (byt.. 8192     -     -
MSGMNB   Default max size of queue 16384     -     -
SHMMNI   Shared memory segments     4096    79 1.93%
SHMALL   Shared memory pages       184[...] 25452 0.00%
SHMMAX   Max size of shared memory 18446744073692774399
SHMMIN   Min size of shared memory     1     -     -
SEMMNI   Number of semaphore ident 32000     0 0.00%
SEMMNS   Total number of semaphore 1024000.. 0 0.00%
SEMMSL   Max semaphores per semap  32000     -     -
SEMOPM   Max number of operations p  500     -     -
SEMVMX   Semaphore max value       32767     -     -

Potresti notare che questo elenco di esempio include tre diversi tipi di meccanismi IPC, ciascuno disponibile nel kernel Linux:messaggi (MSG), memoria condivisa (SHM) e semafori (SEM). Puoi visualizzare l'attività corrente in ciascuno di questi sottosistemi con ipcs comando:

$ ipcs 

------ Message Queues Creators/Owners ---
msqid     perms     cuid      cgid  [...]

------ Shared Memory Segment Creators/Owners
shmid     perms    cuid    cgid  [...]
557056    700      seth    users [...]
3571713   700      seth    users [...]
2654210   600      seth    users [...]
2457603   700      seth    users [...]

------ Semaphore Arrays Creators/Owners ---
semid     perms     cuid      cgid  [...]

Ciò mostra che al momento non sono presenti messaggi o array di semafori, ma sono in uso diversi segmenti di memoria condivisa.

C'è un semplice esempio che puoi eseguire sul tuo sistema in modo da poter vedere uno di questi sistemi al lavoro. Implica del codice C, quindi è necessario disporre di strumenti di compilazione sul sistema. I nomi dei pacchetti che devi installare per poter compilare dal codice sorgente variano a seconda della tua distribuzione, quindi fai riferimento alla tua documentazione per i dettagli. Ad esempio, sulle distribuzioni basate su Debian, puoi conoscere i requisiti di compilazione nella sezione BuildingTutorial del wiki, e sulle distribuzioni basate su Fedora, fare riferimento alla sezione Installazione del software dai sorgenti dei documenti.

Crea una coda di messaggi

Il tuo sistema ha già una coda di messaggi predefinita, ma puoi crearne una tua usando ipcmk comando:

$ ipcmk --queue
Message queue id: 32764

Scrivi un semplice mittente del messaggio IPC, codificando l'ID della coda per semplicità:

#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>

struct msgbuffer {
  char text[24];
} message;

int main() {
    int msqid = 32764;
    strcpy(message.text,"opensource.com");
    msgsnd(msqid, &message, sizeof(message), 0);
    printf("Message: %s\n",message.text);
    printf("Queue: %d\n",msqid);
    return 0;
        }

Compila l'applicazione ed eseguila:

$ gcc msgsend.c -o msg.bin
$ ./msg.bin
Message: opensource.com
Queue: 32769

Hai appena inviato un messaggio alla coda dei messaggi. Puoi verificarlo con ipcs comando, utilizzando la --coda opzione per limitare l'output alla coda dei messaggi:

$ ipcs -q

------ Message Queues --------
key        msqid   owner  perms  used-bytes  messages
0x7b341ab9 0       seth   666    0          0
0x72bd8410 32764   seth   644    24         1

Puoi anche recuperare quei messaggi con:

#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>

struct msgbuffer {
    char text[24];
} message;

int main() {
    int msqid = 32764;
    msgrcv(msqid, &message, sizeof(message),0,0);
    printf("\nQueue: %d\n",msqid);
    printf("Got this message: %s\n", message.text);
    msgctl(msqid,IPC_RMID,NULL);
    return 0;

Compila ed esegui con:

$ gcc get.c -o get.bin
$ ./get.bin

Queue: 32764
Got this message: opensource.com

Scarica l'eBook

Questo è solo un esempio delle lezioni disponibili in A guide to inter-process communication in Linux di Marty Kalin, l'ultimo eBook scaricabile gratuitamente (e Creative Commons) da Opensource.com. In poche brevi lezioni imparerai i metodi POSIX di IPC da code di messaggi, memoria condivisa e semafori, socket, segnali e molto altro. Siediti con il libro di Marty e ne emergerai un programmatore più informato. Ma non è solo per programmatori esperti:se tutto ciò che scrivi sono script di shell, c'è un sacco di conoscenze pratiche su pipe (con nome e senza nome) e file condivisi, oltre a concetti importanti che devi sapere quando usi un file condiviso o una coda di messaggi esterna.

Se sei interessato a creare un ottimo software scritto per essere dinamico e sensibile al sistema, devi conoscere l'IPC. Lascia che questo libro sia la tua guida.


Linux
  1. Una guida al terminale Linux per principianti

  2. Comunicazione tra processi in Linux:socket e segnali

  3. Comunicazione tra processi in Linux:utilizzo di pipe e code di messaggi

  4. Comunicazione tra processi in Linux:archiviazione condivisa

  5. La guida completa per principianti a LVM in Linux

La guida completa per l'utilizzo di ffmpeg in Linux

Come uccidere o terminare un processo Linux:la guida definitiva

Una guida pratica per il comando chroot in Linux

La guida definitiva al sottosistema Windows per Linux (Windows WSL)

La guida definitiva per creare utenti in Linux / Unix

Come eseguire il downgrade dei pacchetti su un sistema Linux:la guida definitiva