POSIXi protsessidevaheline suhtlus (IPC)
IPC-d kasutatakse reaalajas laienduste jaoks. Need sõnumijärjekorrad on osa Linuxist. Neid kõnesid kasutatakse praegu standardina, kuid need võivad olla kaasaegsete versioonide osa. Neid kõnesid on palju puhtama liidesega lihtne teostada.
POSIXi sõnumijärjekorrad Linuxis
V-sõnumite järjekorrad Linuxi süsteemis tuvastatakse võtmete abil, mis on saadud kasutades ftok kõned. Need POSIX-i sõnumijärjekorrad kasutavad tavaliselt nimistringe. Linuxi süsteemides nimetatakse POSIX-i järjekordi stringideks. Neid stringe loetakse algavaks tähtedega / ja neil on siis teised märgid. Protsessid, mis järgivad ja teavad vastavate õigustega järjekorra nime, saavad saata või vastu võtta sõnumeid järjekorda ja tagasi. See aitab täita olulisi funktsioone.
Mis on POSIX-i sõnumijärjekorra kõned?
POSIX-i sõnumijärjekorrad peavad olema seotud kõigi teekidega, mis väljuvad päriselt. Siin on mõned kasutatavad kõned:
librt kasutab kompilaatori valikut -lrtKõnede nimed algavad mq_prefix
Järjekõnede üksikasju arutatakse allpool:
>> mq_open, mq_close
Seda funktsiooni kasutatakse POSIX-järjekorra avamiseks.
Mq_open on funktsioon, mida kasutatakse järjekorra nime kutsumiseks. Järgmine parameeter on lipp, mida kasutatakse sõnumite vastuvõtmiseks. O_WRONLY kasutatakse sõnumite saatmiseks ja O_RDWR kasutatakse järjekorras toimingute saatmiseks ja vastuvõtmiseks. Kasutajad saavad lipu O_NONBLOCK abil määrata blokeerimiseta režiimi järjekorra ja mq_send ja mq_receive andmete järjekorras saatmiseks ja vastuvõtmiseks.
Süntaks
Allpool kuvatakse ülaltoodud järjekorrakõne süntaks:
/ * kasutatakse failide avamiseks * /
# kaasata
/ * faili määramiseks tee põhjal * /
# kaasata
/ * sõnumijärjekirjelduste lisamiseks * /
mqd_t mq_open (const märk * nimi, int oflag);
/ * järjekorra avamiseks ja juurdepääsuks * /
mqd_t mq_open (const märk * nimi, int oflag, mode_t režiim,
struct mq_attribute * atribuut);
Mq_Lipud: Võib olla O või blokeerimata
Mq_MaxMsg: Maksimaalne järjekorra sisestatavate sõnumite arv
Mq_Msgsize: Maksimaalne baitide arv sõnumis
Mq_CurMsgs: Praegu saadetud sõnumid järjekorras
mq_close kõned: Sulgeda kõik järjekorra kirjeldajad.
mq_notify
See on kõne, mida kasutatakse saabumisteate registreerimiseks ja registreerimise tühistamiseks, kui sõnum siseneb tühja järjekorda.
Süntaks
# kaasata/ *, et lisada koodist kõik sõnumijärjekorra kirjeldused * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * teate saabumisest järjekorda * /
mq_unlink
Seda kasutatakse järjekorra, millel on järjekorra_nimi, eemaldamiseks.
Süntaks
int mq_unlink (const char * järjekorra nimi);/ * Selle järjekorra eemaldamiseks, mille nimi on järjekorra_nimi * /
mq_getattr, mq_setattr
Sellel funktsioonil on atribuudistruktuur:
struct mq_attr kasutatakse kirjeldajate sõnumijärjekorrana.
mq_setattr kasutatakse atribuutide seadmiseks järjekorras.
Süntaks
# kaasataint mq_getattribute (mqd_t mqdes, struct mq_attribute * atribuut);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);
Näide: klient-server suhtlus POSIXi kaudu
Järgnev näide kliendi-serveri suhtluse teostamisest POSIX-i sõnumijärjekordade kaudu. Selles näites on meil kliendifail ja serverifail.
Meil on kaks faili: esimene (serveri) fail on server.c, ja teine (kliendi) fail on klient.c.
Serveri kood
Allpool kuvatud pilt näitab koodi, mida kasutasime kliendi-serveri suhtlemiseks. Kõigepealt kutsusime stringe, muutujaid ja funktsioone määratlema mõned teegid. Seejärel määratlesime fcntl funktsioon ja järjekorra serveri nimi. Pärast seda määrasime serveri järjekorra nime, millele järgnesid selle sõnumi suurus ja puhvri suurus, et määrata sõnumite suurus, mis sobivad korraga meie puhvriga. Järgmisena helistasime ja kirjeldasime järjekordi, seejärel genereerisime järgmised märgid, et näha kliendi vastust, kui see kliendile saadeti. Lõpuks kinnitamine lõpetati sõnumi printimisega serveri lõpust. Järgmises jaotises näete eelmises jaotises käsitletud lippe.
Algatasime kõik lipud, sealhulgas mq_flags, mq_maxmsgs, jne. taotluste salvestamise jätkamiseks. Seejärel rakendasime tingimuse serveri nimele ja salvestasime sõnumid järjekorra puhvrisse. Pärast seda tagasime salvestamise ajal, et järjekorrad järgiksid eesõigul põhinevat prioriteedireeglit. Lõpus kuvab kood tõrketeate, kui kliendilõpult on saadud vigu. Lõpuks väljusime serverist, et kliendile päring saata.
Salvestage server.c fail
Kliendi kood
Nüüd arutame teist faili. Allpool kuvatud pilt on kood, mida kasutasime kliendi-serveri suhtlemiseks. Kood algas tavaliste teekide helistamise ja muutuvate päiste määratlemisega. Seejärel määratlesime stringid ja igat tüüpi andmed. Pärast seda kuulutasime serveri järjekorra nime määratlemiseks järjekorra päise. Järgmisena määratlesime loa järjekorrad ja sõnumi suuruse järjekorras koos sõnumipuhvri suurusega (maksimaalne suurus, mis võiks järjekorda mahtuda).
Kirjeldame järjekordi ja loome uue kliendi serveri otsast saadetud sõnumite vastuvõtmiseks. Seejärel kutsume lipud ja lähtestame need ning kutsume kliendilõpu funktsiooni. See väljub funktsioonist vea korral. Väärtus salvestatakse puhvrisse ja päringuvastus saadetakse serverile. Vastuse korral esitab server loa, mis prinditakse pärast seda, kui kliendi lõpp on sisendi sisestanud. Vea korral tagastab see vea väärtused, s.t.e., klient pole suutnud serverile sõnumit saata. Pärast seda väljume kliendist.
Salvestage klient.c fail
Failide täitmine
Kasutame a gcc kompilaator failide käivitamiseks. Serveri lõppfaili käivitamiseks tippige terminaliaknasse lisatud käsk:
$ sudo gcc-server.c -lrt
Järgmisena tippige järgmine:
$ ./ a.välja
Väljund kuvatakse järgmiselt:
Kliendi vastuse juurde liikumiseks sisestage järgmine:
$ sudo gcc klient.c -lrt
Seejärel käivitage järgmine:
$ ./ a.välja
Väljund kuvatakse järgmiselt:
Järeldus
Selles artiklis õppisite, kuidas saata C-programmeerimisega POSIXi sõnumijärjekordi, samuti mõningaid selle funktsioone. Seejärel nägite selle protsessi mõningaid näiteid üksikasjalikumalt.