Einen Softwareprozess dazu zu bringen, mit einem anderen Softwareprozess zu kommunizieren, ist ein heikler Balanceakt. Es kann jedoch eine lebenswichtige Funktion für eine Anwendung sein, also ist es ein Problem, das jeder Programmierer lösen muss, der sich auf ein komplexes Projekt einlässt. Ob Ihre Anwendung einen Job starten muss, der von der Software eines anderen verarbeitet wird; um eine Aktion zu überwachen, die von einem Peripheriegerät oder über ein Netzwerk ausgeführt wird; oder um ein Signal von einer anderen Quelle zu erkennen, wenn Ihre Software auf etwas außerhalb ihres eigenen Codes angewiesen ist, um zu wissen, was als nächstes zu tun ist oder wann es zu tun ist, müssen Sie über die Interprozesskommunikation (IPC) nachdenken.
Weitere Linux-Ressourcen
- Spickzettel für Linux-Befehle
- Spickzettel für fortgeschrittene Linux-Befehle
- Kostenloser Online-Kurs:RHEL Technical Overview
- Spickzettel für Linux-Netzwerke
- SELinux-Spickzettel
- Spickzettel für allgemeine Linux-Befehle
- Was sind Linux-Container?
- Unsere neuesten Linux-Artikel
Das Unix-Betriebssystem hat dies vor langer Zeit berücksichtigt, möglicherweise aufgrund einer frühen Erwartung, dass Software aus unterschiedlichen Quellen stammen würde. In der gleichen Tradition bietet Linux viele der gleichen Schnittstellen für IPC und einige neue. Der Linux-Kernel verfügt über mehrere IPC-Methoden, und das util-linux-Paket enthält das ipcmk , ipcrm , ipcs und lsipc Befehle zum Überwachen und Verwalten von IPC-Nachrichten.
IPC-Informationen anzeigen
Bevor Sie mit IPC experimentieren, sollten Sie wissen, welche IPC-Funktionen bereits auf Ihrem System vorhanden sind. Der lsipc Befehl liefert diese Informationen.
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 - -
Sie werden vielleicht bemerken, dass diese Beispielliste drei verschiedene Arten von IPC-Mechanismen enthält, die jeweils im Linux-Kernel verfügbar sind:Nachrichten (MSG), gemeinsam genutzter Speicher (SHM) und Semaphoren (SEM). Mit den ipcs können Sie die aktuelle Aktivität in jedem dieser Subsysteme anzeigen Befehl:
$ 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 [...]
Dies zeigt, dass derzeit keine Nachrichten oder Semaphor-Arrays vorhanden sind, aber eine Reihe von Shared-Memory-Segmenten verwendet werden.
Es gibt ein einfaches Beispiel, das Sie auf Ihrem System ausführen können, damit Sie eines dieser Systeme bei der Arbeit sehen können. Es beinhaltet etwas C-Code, also müssen Sie Build-Tools auf Ihrem System haben. Die Namen der Pakete, die Sie installieren müssen, um aus dem Quellcode bauen zu können, variieren je nach Ihrer Distribution, beziehen Sie sich also auf Ihre Dokumentation für Einzelheiten. Bei Debian-basierten Distributionen können Sie beispielsweise mehr über die Build-Anforderungen im BuildingTutorial-Abschnitt des Wikis erfahren, und bei Fedora-basierten Distributionen lesen Sie den Abschnitt Installing software from source der Dokumentation.
Eine Nachrichtenwarteschlange erstellen
Ihr System hat bereits eine Standard-Nachrichtenwarteschlange, aber Sie können mit ipcmk Ihre eigene erstellen Befehl:
$ ipcmk --queue
Message queue id: 32764
Schreiben Sie einen einfachen IPC-Nachrichtensender, der der Einfachheit halber fest in die Warteschlangen-ID codiert ist:
#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;
}
Kompilieren Sie die Anwendung und führen Sie sie aus:
$ gcc msgsend.c -o msg.bin
$ ./msg.bin
Message: opensource.com
Queue: 32769
Sie haben gerade eine Nachricht an Ihre Nachrichtenwarteschlange gesendet. Sie können das mit den ipcs überprüfen Befehl mit dem Befehl --queue Option, um die Ausgabe auf die Nachrichtenwarteschlange zu beschränken:
$ ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x7b341ab9 0 seth 666 0 0
0x72bd8410 32764 seth 644 24 1
Sie können diese Nachrichten auch abrufen mit:
#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;
Kompilieren und ausführen mit:
$ gcc get.c -o get.bin
$ ./get.bin
Queue: 32764
Got this message: opensource.com
Laden Sie das eBook herunter
Dies ist nur ein Beispiel für die Lektionen in Marty Kalins A guide to inter-process communication in Linux, dem neuesten kostenlosen (und Creative Commons) herunterladbaren eBook von Opensource.com. In nur wenigen kurzen Lektionen lernen Sie POSIX-Methoden von IPC aus Nachrichtenwarteschlangen, gemeinsam genutztem Speicher und Semaphoren, Sockets, Signalen und vielem mehr kennen. Setzen Sie sich mit Martys Buch zusammen, und Sie werden als besser informierter Programmierer hervorgehen. Aber es ist nicht nur etwas für erfahrene Programmierer – wenn alles, was Sie jemals schreiben, Shell-Skripte sind, gibt es jede Menge praktisches Wissen über Pipes (benannte und unbenannte) und gemeinsam genutzte Dateien sowie wichtige Konzepte, die Sie kennen müssen, wenn Sie eine gemeinsam genutzte Datei verwenden oder eine externe Nachrichtenwarteschlange.
Wenn Sie daran interessiert sind, großartige Software zu entwickeln, die dynamisch und systembewusst geschrieben ist, müssen Sie sich mit IPC auskennen. Lassen Sie sich von diesem Buch leiten.