Meziprocesová komunikace POSIX (IPC)
IPC se používá pro rozšíření v reálném čase. Tyto fronty zpráv jsou součástí Linuxu. Tyto hovory se nyní používají jako standard, ale mohou být součástí současných verzí. Tyto hovory lze snadno implementovat pomocí mnohem čistšího rozhraní.
Fronty zpráv POSIX v Linuxu
Fronty zpráv V v systému Linux jsou identifikovány pomocí klíčů získaných pomocí ftok hovory. Tyto fronty zpráv POSIX obvykle používají řetězce jmen. V systémech Linux se fronty POSIX nazývají řetězce. Uvažuje se, že tyto řetězce začínají na / a poté mají další znaky. Procesy, které sledují a znají název fronty s příslušnými právy, mohou odesílat nebo přijímat zprávy do a z fronty. To pomůže při provádění důležitých funkcí.
Co jsou hovory z fronty zpráv POSIX?
Fronty zpráv POSIX se musí propojit s jakoukoli knihovnou, která skutečně končí. Následuje několik použitých hovorů:
librt používá volbu kompilátoru -lrtNázvy volání začínají mq_prefix
Podrobnosti o hovorech ve frontě jsou popsány níže:
>> mq_open, mq_close
Tato funkce se používá k otevření fronty POSIX.
Mq_open je funkce, která se používá k volání názvu fronty. Dalším parametrem je příznak používaný k přijímání zpráv. O_WRONLY se používá k odesílání zpráv a O_RDWR se používá k odesílání a přijímání operací ve frontě. Uživatelé mohou pomocí příznaku O_NONBLOCK určit frontu do neblokujícího režimu a mq_send a mq_receive odesílat a přijímat data ve frontě.
Syntax
Syntaxe výše uvedeného volání fronty je zobrazena níže:
/ * slouží k otevření souborů * /
#zahrnout
/ * k určení souboru na základě cesty * /
#zahrnout
/ * zahrnout popisy front zpráv * /
mqd_t mq_open (const znak * jméno, int oflag);
/ * pro otevření a přístup do fronty * /
mqd_t mq_open (const znak * name, int oflag, mode_t mode,
struct mq_attribute * atribut);
Mq_Flags: Může to být O nebo neblokované
Mq_MaxMsg: Maximální počet zpráv, které lze zadat do fronty
Mq_Msgsize: Maximální počet bajtů ve zprávě
Mq_CurMsgs: Aktuálně odeslané zprávy ve frontě
mq_close hovory: Zavřít všechny deskriptory fronty.
mq_notify
Jedná se o volání sloužící k registraci a zrušení registrace oznámení o příjezdu, když zpráva vstoupí do prázdné fronty.
Syntax
#zahrnout/ * zahrnout všechny popisy fronty zpráv z kódu * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * upozornit na příchod zprávy ve frontě * /
mq_unlink
Slouží k odebrání fronty, která má název_fronty.
Syntax
int mq_unlink (const char * queue_name);/ * Odebrání fronty s názvem queue_name * /
mq_getattr, mq_setattr
Tato funkce má strukturu atributů:
struct mq_attr se používá jako fronta zpráv pro deskriptory.
mq_setattr se používá pro nastavení atributů uvnitř fronty.
Syntax
#zahrnoutint mq_getattribute (mqd_t mqdes, struct mq_attribute * atribut);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);
Příklad: Komunikace klient-server přes POSIX
Následuje příklad provádění komunikace klient-server prostřednictvím front zpráv POSIX. V příkladu budeme mít soubor klienta a soubor serveru.
Budeme mít dva soubory: první (serverový) soubor je serveru.C, a druhý (klientský) soubor je klient.C.
Kód serveru
Obrázek zobrazený níže ukazuje kód, který jsme použili pro komunikaci klient-server. Nejprve jsme zavolali některé knihovny, abychom definovali řetězce, proměnné a funkce. Poté jsme definovali fcntl funkce a název serveru fronty. Poté jsme definovali název fronty serveru, následovaný velikostí zprávy a velikostí vyrovnávací paměti, abychom definovali velikost zpráv, aby se vešly do naší vyrovnávací paměti najednou. Dále jsme zavolali a popsali fronty, poté jsme vygenerovali další tokeny, abychom viděli odpověď klienta, jakmile byla odeslána klientovi. Nakonec bylo potvrzení dokončeno vytištěním zprávy z konce serveru. V další části uvidíte příznaky popsané v předchozí části.
Inicializovali jsme všechny příznaky, včetně mq_flags, mq_maxmsgs, atd. pokračovat v ukládání požadavků. Poté jsme podmínku aplikovali na název serveru a uložili jsme zprávy do vyrovnávací paměti fronty. Poté jsme v době skladování zajistili, aby fronty následovaly pravidlo priority, kdo přijde dříve. Na konci kód zobrazí zprávu o selhání, pokud dojde k chybám přijatým z klientského konce. Nakonec jsme opustili server a odeslali požadavek klientovi.
Uložte server.soubor c
Klientský kód
Nyní probereme druhý soubor. Obrázek zobrazený níže je kód, který jsme použili pro komunikaci klient-server. Kód začal voláním standardních knihoven a definováním záhlaví proměnných. Poté jsme definovali řetězce a všechny typy dat. Poté jsme deklarovali záhlaví fronty, abychom definovali název fronty serveru. Dále jsme definovali fronty oprávnění a velikost zprávy uvnitř fronty spolu s velikostí vyrovnávací paměti zpráv (maximální velikost, která se vejde do fronty).
Popíšeme fronty a vytvoříme nového klienta pro příjem zpráv odeslaných z konce serveru. Potom zavoláme příznaky a inicializujeme je a zavoláme funkci na straně klienta. V případě chyby funkci ukončí. Hodnota je uložena uvnitř vyrovnávací paměti a na server je odeslána odpověď na požadavek. V případě odpovědi pak server poskytne token, který se vytiskne, jakmile klient zadá vstup. V případě chyby vrátí chybové hodnoty, tj.E., klient nebyl schopen odeslat zprávu na server. Poté klienta opustíme.
Uložte klienta.soubor c
Provádění souborů
Používáme a gcc kompilátor ke spuštění souborů. Chcete-li spustit koncový soubor serveru, zadejte připojený příkaz do okna terminálu:
$ sudo gcc server.c -lrt
Dále zadejte následující:
$ ./A.ven
Výstup se zobrazí takto:
Přejděte na odpověď klienta a zadejte následující:
$ sudo gcc klient.c -lrt
Potom spusťte následující:
$ ./A.ven
Výstup se zobrazí takto:
Závěr
V tomto článku jste se dozvěděli, jak posílat fronty zpráv POSIX s programováním v C, stejně jako některé z jeho funkcí. Poté jste viděli podrobněji některé příklady tohoto procesu.