GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einführung in den Leitfaden zur Kommunikation zwischen Prozessen in Linux

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.


Linux
  1. Eine Anleitung zum Linux-Terminal für Anfänger

  2. Kommunikation zwischen Prozessen in Linux:Sockets und Signale

  3. Kommunikation zwischen Prozessen in Linux:Verwendung von Pipes und Nachrichtenwarteschlangen

  4. Kommunikation zwischen Prozessen in Linux:Shared Storage

  5. Linux-Tools:Mit dmesg die Nachricht rausholen

Das vollständige Handbuch zur Verwendung von ffmpeg unter Linux

So beenden oder beenden Sie einen Linux-Prozess:Der ultimative Leitfaden

Ein praktischer Leitfaden für den Chroot-Befehl unter Linux

Der ultimative Leitfaden zum Windows-Subsystem für Linux (Windows WSL)

Der ultimative Leitfaden zum Erstellen von Benutzern in Linux / Unix

So führen Sie ein Downgrade von Paketen auf einem Linux-System durch:Der ultimative Leitfaden