POSIX međuprocesna komunikacija (IPC)
IPC se koristi za produženja u stvarnom vremenu. Ti su redovi poruka dio Linuxa. Ti se pozivi sada koriste kao standard, ali možda su dio suvremenih verzija. Te je pozive jednostavno implementirati s mnogo čišćim sučeljem.
Redovi poruka POSIX u Linuxu
V redovi poruka u sustavu Linux identificiraju se pomoću ključeva koji su dobiveni pomoću ftok poziva. Ovi redovi poruka POSIX obično koriste nizove imena. U Linux sustavima, POSIX redovi nazivaju se nizovima. Smatra se da ovi nizovi počinju s /, a zatim imaju druge znakove. Procesi koji slijede i znaju naziv naziva reda s odgovarajućim pravima mogu slati ili primati poruke u red i iz njega. To će vam pomoći u obavljanju važnih funkcija.
Što su pozivi u redu čekanja poruka POSIX?
Redovi poruka POSIX moraju se povezati s bilo kojom knjižnicom koja stvarno izlazi. Slijedi nekoliko korištenih poziva:
librt koristi opciju kompajlera -lrtImena poziva počinju s mq_prefixom
Pojedinosti o pozivima u redu razmatraju se u nastavku:
>> mq_open, mq_close
Ova se funkcija koristi za otvaranje POSIX reda.
Mq_open je funkcija koja se koristi za pozivanje imena reda. Sljedeći je parametar zastava koja se koristi za primanje poruka. O_WRONLY se koristi za slanje poruka, a O_RDWR za slanje i primanje operacija unutar reda čekanja. Korisnici mogu upotrijebiti zastavicu O_NONBLOCK za određivanje reda u način neblokiranja i mq_send i mq_primiti za slanje i primanje podataka u redu čekanja.
Sintaksa
Sintaksa za gornji poziv u redu prikazana je u nastavku:
/ * koristi se za otvaranje datoteka * /
#include
/ * za određivanje datoteke na temelju putanje * /
#include
/ * uključiti opise reda poruka * /
mqd_t mq_open (const znak * ime, int oflag);
/ * za otvaranje i pristup redu * /
mqd_t mq_open (const znak * ime, int oflag, mode_t mode,
struct mq_attribute * atribut);
Mq_Zastavice: Može biti O ili neblokirano
Mq_MaxMsg: Maksimalan broj poruka koje se mogu unijeti unutar reda čekanja
Mq_Msgsize: Maksimalan broj bajtova u poruci
Mq_CurMsgs: Trenutno poslane poruke u redu čekanja
mq_close pozivi: Za zatvaranje svih deskriptora reda.
mq_notify
To je poziv koji se koristi za registraciju i odjavu obavijesti o dolasku kada poruka uđe u prazan red.
Sintaksa
#include/ * uključiti sve opise reda poruka iz koda * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * da obavijesti o primanju poruke u redu čekanja * /
mq_unlink
Koristi se za uklanjanje reda s imenom_reda.
Sintaksa
int mq_unlink (const char * ime_reda);/ * Uklanjanje reda s imenom queue_name * /
mq_getattr, mq_setattr
Ova funkcija ima strukturu atributa:
struct mq_attr koristi se kao red poruka za deskriptore.
mq_setattr koristi se za postavljanje atributa unutar reda.
Sintaksa
#includeint mq_getattribute (mqd_t mqdes, struct mq_attribute * atribut);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);
Primjer: Komunikacija klijent-poslužitelj putem POSIX-a
Slijedi primjer izvođenja komunikacije klijent-poslužitelj putem redova poruka POSIX. U primjeru ćemo imati datoteku klijenta i datoteku poslužitelja.
Imat ćemo dvije datoteke: prva (poslužiteljska) datoteka je poslužitelju.c, a druga datoteka (klijenta) je klijent.c.
Šifra poslužitelja
Slika prikazana dolje prikazuje kôd koji smo koristili za komunikaciju klijent-poslužitelj. Prvo smo nazvali neke knjižnice da definiramo nizove, varijable i funkcije. Zatim smo definirali fcntl funkcija i ime poslužitelja reda. Nakon toga definirali smo ime reda poslužitelja, nakon čega slijedi njegova veličina poruke i veličina međuspremnika, kako bismo definirali veličinu poruka kako bi odgovarale našem međuspremniku. Zatim smo nazvali i opisali redove, a zatim smo generirali sljedeće tokene da bismo vidjeli odgovor klijenta nakon što je poslan klijentu. Konačno, potvrda je dovršena ispisom poruke s kraja poslužitelja. U sljedećem ćete odjeljku vidjeti zastave o kojima je bilo riječi u prethodnom odjeljku.
Inicirali smo sve zastavice, uključujući mq_ zastave, mq_maxmsgs, itd. da biste nastavili s pohranjivanjem zahtjeva. Zatim smo primijenili uvjet na ime poslužitelja i poruke pohranili u međuspremnik reda. Nakon toga, u vrijeme pohrane, osigurali smo da su redovi slijedili pravilo prioriteta zasnovano na prvom dolasku. Na kraju, kôd prikazuje poruku o neuspjehu ako postoje pogreške primljene s klijentskog kraja. Napokon, izašli smo iz poslužitelja kako bismo poslali zahtjev klijentu.
Spremite poslužitelj.c datoteka
Šifra klijenta
Sada ćemo razgovarati o drugom spisu. Slika prikazana ispod je kod koji smo koristili za komunikaciju klijent-poslužitelj. Kôd je započeo pozivanjem standardnih knjižnica i definiranjem zaglavlja varijabli. Zatim smo definirali nizove i sve vrste podataka. Nakon toga proglasili smo zaglavlje reda kako bismo definirali ime reda poslužitelja. Dalje, definirali smo redove dozvola i veličinu poruke unutar reda, zajedno s veličinom međuspremnika poruka (maksimalna veličina koja bi mogla stati u red čekanja).
Opisat ćemo redove i stvoriti novog klijenta za primanje poruka poslanih s kraja poslužitelja. Zatim ćemo pozvati zastavice i inicijalizirati ih te pozvati funkciju kraj klijenta. Iz funkcije će izaći u slučaju pogreške. Vrijednost je pohranjena u međuspremniku, a odgovor na zahtjev šalje se poslužitelju. U slučaju odgovora, poslužitelj će tada pružiti token koji se ispisuje nakon što je kraj klijenta ušao u ulaz. U slučaju pogreške, vratit će vrijednosti pogreške, tj.e., klijent nije mogao poslati poruku poslužitelju. Nakon toga izaći ćemo iz klijenta.
Spremi klijenta.c datoteka
Izvršavanje datoteka
Koristimo a gcc kompajler za izvršavanje datoteka. Da biste pokrenuli završnu datoteku poslužitelja, upišite dodanu naredbu u prozor terminala:
$ sudo gcc poslužitelj.c -lrt
Zatim upišite sljedeće:
$ ./ a.van
Izlaz će se pojaviti na sljedeći način:
Prijelazeći na odgovor klijenta, upišite sljedeće:
$ sudo gcc klijent.c -lrt
Zatim pokrenite sljedeće:
$ ./ a.van
Izlaz će se pojaviti na sljedeći način:
Zaključak
U ovom ste članku naučili kako slati redove poruka POSIX s C programiranjem, kao i neke od njegovih funkcija. Zatim ste detaljnije vidjeli neke primjere ovog postupka.