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.