Přimět jeden softwarový proces, aby mluvil s jiným softwarovým procesem, je choulostivé vyvažování. Může to být životně důležitá funkce pro aplikaci, takže je to problém, který musí vyřešit každý programátor, který se pouští do složitého projektu. Zda vaše aplikace potřebuje zahájit úlohu, kterou zpracovává software někoho jiného; ke sledování akce prováděné periferním zařízením nebo přes síť; nebo k detekci signálu z nějakého jiného zdroje, když váš software spoléhá na něco mimo svůj vlastní kód, aby věděl, co dělat dál nebo kdy to udělat, musíte přemýšlet o meziprocesové komunikaci (IPC).
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Operační systém Unix s tím počítal již dávno, možná kvůli dřívějšímu očekávání, že software bude pocházet z různých zdrojů. Ve stejné tradici Linux poskytuje mnoho stejných rozhraní pro IPC a některá nová. Linuxové jádro obsahuje několik metod IPC a balíček util-linux obsahuje ipcmk , ipcrm , ips a lsipc příkazy pro monitorování a správu zpráv IPC.
Zobrazit informace IPC
Než začnete s IPC experimentovat, měli byste vědět, jaká zařízení IPC již ve vašem systému jsou. lsipc příkaz poskytuje tyto informace.
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 - -
Můžete si všimnout, že tento ukázkový výpis obsahuje tři různé typy mechanismů IPC, z nichž každý je dostupný v jádře Linuxu:zprávy (MSG), sdílená paměť (SHM) a semafory (SEM). Aktuální aktivitu v každém z těchto podsystémů můžete zobrazit pomocí ipcs příkaz:
$ 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 [...]
To ukazuje, že v současné době neexistují žádné zprávy ani pole semaforů, ale používá se řada segmentů sdílené paměti.
Existuje jednoduchý příklad, který můžete provést na svém systému, abyste viděli, jak jeden z těchto systémů funguje. Zahrnuje to nějaký kód C, takže musíte mít ve svém systému nástroje pro sestavení. Názvy balíčků, které musíte nainstalovat, abyste mohli sestavit ze zdrojového kódu, se liší v závislosti na vaší distribuci, takže podrobnosti najdete ve vaší dokumentaci. Například u distribucí založených na Debianu se můžete dozvědět o požadavcích na sestavení v části BuildingTutorial na wiki a u distribucí založených na Fedoře se podívejte na sekci Instalace softwaru ze zdrojového dokumentu v dokumentaci.
Vytvořit frontu zpráv
Váš systém již má výchozí frontu zpráv, ale můžete si vytvořit vlastní pomocí ipcmk příkaz:
$ ipcmk --queue
Message queue id: 32764
Napište jednoduchého odesílatele zprávy IPC, pro zjednodušení napevno zakódujte ID fronty:
#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;
}
Zkompilujte aplikaci a spusťte ji:
$ gcc msgsend.c -o msg.bin
$ ./msg.bin
Message: opensource.com
Queue: 32769
Právě jste odeslali zprávu do vaší fronty zpráv. Můžete si to ověřit pomocí ipcs pomocí příkazu --queue možnost omezit výstup na frontu zpráv:
$ ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x7b341ab9 0 seth 666 0 0
0x72bd8410 32764 seth 644 24 1
Tyto zprávy můžete také načíst pomocí:
#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;
Zkompilujte a spusťte pomocí:
$ gcc get.c -o get.bin
$ ./get.bin
Queue: 32764
Got this message: opensource.com
Stáhněte si e-knihu
Toto je jen jeden příklad lekcí dostupných v Marty Kalin's A guide to inter-process communication in Linux, nejnovější bezplatné (a Creative Commons) stahovatelné elektronické knize z Opensource.com. V několika krátkých lekcích se dozvíte o POSIX metodách IPC z front zpráv, sdílené paměti a semaforů, soketů, signálů a mnoho dalšího. Posaďte se s Martyho knihou a stanete se lépe informovaným programátorem. Není to však jen pro zkušené kodéry – pokud vše, co kdy píšete, jsou skripty shellu, existuje spousta praktických znalostí o kanálech (pojmenovaných i nepojmenovaných) a sdílených souborech, stejně jako o důležitých konceptech, které potřebujete vědět, když používáte sdílený soubor. nebo externí fronta zpráv.
Pokud máte zájem vytvářet skvělý software, který je napsán tak, aby byl dynamický a znalý systému, musíte vědět o IPC. Nechť je tato kniha vaším průvodcem.