„POSIX“ procesų komunikacija (IPC)
IPC naudojamas plėtiniams realiuoju laiku. Šios pranešimų eilės yra „Linux“ dalis. Šie skambučiai dabar naudojami kaip standartas, tačiau gali būti šiuolaikinių versijų dalis. Šiuos skambučius lengva įgyvendinti naudojant daug švaresnę sąsają.
„POSIX“ pranešimų eilės sistemoje „Linux“
V pranešimų eilės „Linux“ sistemoje nustatomos naudojant raktus, gautus naudojant ftok skambučių. Šiose POSIX pranešimų eilėse paprastai naudojamos vardų eilutės. „Linux“ sistemose POSIX eilės vadinamos eilutėmis. Laikoma, kad šios eilutės prasideda / ir tada turi kitus simbolius. Procesai, kurie seka ir žino eilės pavadinimą su atitinkamomis teisėmis, gali siųsti arba gauti pranešimus į eilę ir iš jos. Tai padės atlikti svarbias funkcijas.
Kas yra „POSIX“ pranešimų eilės skambučiai?
POSIX pranešimų eilės turi būti susietos su bet kuria biblioteka, kuri išeina iš tikrųjų. Toliau pateikiami keli naudojami skambučiai:
librt naudoja kompiliatoriaus parinktį -lrtSkambučių pavadinimai prasideda „mq_prefix“
Išsami informacija apie skambučius eilėje aptariama toliau:
>> mq_open, mq_close
Ši funkcija naudojama norint atidaryti POSIX eilę.
„Mq_open“ yra funkcija, naudojama eilės pavadinimui iškviesti. Kitas parametras yra vėliava, naudojama pranešimams gauti. O_WRONLY naudojamas pranešimams siųsti, o O_RDWR naudojamas operacijoms eilėje siųsti ir gauti. Vartotojai gali naudoti vėliavą O_NONBLOCK, norėdami nurodyti eilę į neblokavimo režimą ir mq_send ir mq_receive siųsti ir gauti duomenis eilėje.
Sintaksė
Pirmiau pateikiama aukščiau nurodyto eilės skambučio sintaksė:
/ * naudojamas failams atidaryti * /
# įtraukti
/ * nustatyti failą pagal kelią * /
# įtraukti
/ * įtraukti pranešimų eilių aprašymus * /
mqd_t mq_open (const simbolis * vardas, int oflag);
/ * atidaryti ir patekti į eilę * /
mqd_t mq_open (konst. simbolio * vardas, int oflag, mode_t režimas,
struct mq_attribute * atributas);
Mq_Flags: Gali būti O arba neblokuotas
Mq_MaxMsg: Didžiausias pranešimų, kuriuos galima įvesti eilėje, skaičius
Mq_Msgsize: Maksimalus baitų skaičius pranešime
Mq_CurMsgs: Šiuo metu išsiųsti pranešimai eilėje
mq_close skambučiai: Uždaryti visus eilės aprašus.
mq_notify
Tai skambutis, naudojamas registruoti ir išregistruoti atvykimo pranešimą, kai pranešimas patenka į tuščią eilę.
Sintaksė
# įtraukti/ * įtraukti visus pranešimų eilių aprašus iš kodo * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * pranešti apie pranešimo atvykimą į eilę * /
mq_unlink
Jis naudojamas norint pašalinti eilę su eilės_pavadinimu.
Sintaksė
int mq_unlink (const char * queue_name);/ * Norėdami pašalinti eilę, kurios vardas yra eilės_pavadinimas * /
mq_getattr, mq_setattr
Ši funkcija turi atributų struktūrą:
struct mq_attr naudojamas kaip pranešimų eilė aprašams.
„mq_setattr“ naudojamas nustatant atributus eilėje.
Sintaksė
# įtrauktiint mq_getattribute (mqd_t mqdes, struct mq_attribute * atributas);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);
Pavyzdys: Kliento ir serverio ryšys per POSIX
Toliau pateiktas kliento ir serverio ryšio per POSIX pranešimų eiles pavyzdys. Pavyzdyje turėsime kliento failą ir serverio failą.
Turėsime du failus: pirmasis (serverio) failas yra serverio.c, o kitas (kliento) failas yra klientas.c.
Serverio kodas
Žemiau pateiktame paveikslėlyje parodytas kodas, kurį naudojome ryšiui su klientu ir serveriu. Pirma, mes paskambinome į kai kurias bibliotekas, kad apibrėžtume eilutes, kintamuosius ir funkcijas. Tada mes apibrėžėme fcntl funkciją ir eilės serverio pavadinimą. Po to mes nustatėme serverio eilės pavadinimą, po jo pranešimo dydį ir buferio dydį, kad nustatytume pranešimų dydį, kad jie atitiktų mūsų buferį vienu metu. Tada paskambinome ir aprašėme eiles, tada sugeneravome kitus prieigos raktus, kad pamatytume kliento atsakymą, kai tik jis buvo išsiųstas klientui. Galiausiai patvirtinimas buvo baigtas atspausdinus pranešimą iš serverio pabaigos. Kitame skyriuje pamatysite vėliavėles, aptartas ankstesniame skyriuje.
Inicijavome visas vėliavas, įskaitant mq_flags, mq_maxmsgs, ir pan. tęsti prašymų saugojimą. Tada sąlygą pritaikėme serverio pavadinimui ir pranešimus išsaugojome eilės buferyje. Po to, saugojimo metu, mes užtikrinome, kad eilės atitiktų pirmumo principą. Pabaigoje kodas rodo klaidos pranešimą, jei yra klaidų, gautų iš kliento pabaigos. Galiausiai išėjome iš serverio, kad išsiųstume užklausą klientui.
Išsaugokite serverį.c failą
Kliento kodas
Dabar aptarsime antrąjį failą. Žemiau pateiktas vaizdas yra kodas, kurį naudojome kliento ir serverio ryšiui palaikyti. Kodas prasidėjo skambinant standartinėms bibliotekoms ir apibrėžiant kintamas antraštes. Tada mes apibrėžėme eilutes ir visų tipų duomenis. Po to mes paskelbėme eilės antraštę, kad apibrėžtume serverio eilės pavadinimą. Toliau mes nustatėme leidimų eiles ir pranešimo dydį eilėje kartu su pranešimo buferio dydžiu (didžiausiu dydžiu, kuris gali tilpti eilėje).
Aprašysime eiles ir sukursime naują klientą, kad gautumėte iš serverio galo išsiųstus pranešimus. Tada iškviesime vėliavas, jas inicializuosime ir iškviesime kliento pabaigos funkciją. Klaidos atveju ji išeis iš funkcijos. Vertė saugoma buferio viduje, o užklausos atsakymas siunčiamas į serverį. Atsakymo atveju serveris pateiks prieigos raktą, kuris bus atspausdintas, kai kliento galas įves įvestį. Jei įvyko klaida, ji grąžins klaidos reikšmes, t.e., klientas negalėjo išsiųsti pranešimo į serverį. Po to mes išeisime iš kliento.
Išsaugokite klientą.c failą
Failų vykdymas
Mes naudojame a gcc kompiliatorius vykdyti failus. Norėdami paleisti serverio pabaigos failą, terminalo lange įveskite pridėtą komandą:
$ sudo gcc serveris.c -lrt
Tada įveskite:
$ ./ a.išėjo
Rezultatas pasirodys taip:
Pereinant prie kliento atsakymo, įveskite:
$ sudo gcc klientas.c -lrt
Tada paleiskite šiuos veiksmus:
$ ./ a.išėjo
Rezultatas pasirodys taip:
Išvada
Šiame straipsnyje jūs sužinojote, kaip siųsti POSIX pranešimų eiles su C programavimu, taip pat kai kurias jo funkcijas. Tada jūs pamatėte keletą šio proceso pavyzdžių išsamiau.