C Programmēšana

POSIX ziņojumu rindas ar C programmēšanu

POSIX ziņojumu rindas ar C programmēšanu

POSIX starpprocesu komunikācija (IPC)

IPC tiek izmantots reāllaika paplašinājumiem. Šīs ziņojumu rindas ir daļa no Linux. Šie zvani tagad tiek izmantoti kā standarts, taču tie var būt daļa no mūsdienu versijām. Šos zvanus ir viegli īstenot, izmantojot daudz tīrāku saskarni.

POSIX ziņojumu rindas operētājsistēmā Linux

V ziņojumu rindas Linux sistēmā tiek identificētas, izmantojot atslēgas, kas iegūtas, izmantojot ftok zvani. Šajās POSIX ziņojumu rindās parasti tiek izmantotas vārdu virknes. Linux sistēmās POSIX rindas sauc par virknēm. Tiek uzskatīts, ka šīs virknes sākas ar / un pēc tam tām ir citas rakstzīmes.  Procesi, kas seko rindas nosaukumam un zina attiecīgās tiesības, var nosūtīt vai saņemt ziņojumus uz rindu un no tās. Tas palīdzēs veikt svarīgas funkcijas.

Kas ir POSIX ziņojumu rindas zvani?

POSIX ziņojumu rindām jābūt saistītām ar jebkuru bibliotēku, kas iziet reāli. Tālāk ir norādīti daži izmantotie zvani:

librt izmanto kompilatora opciju -lrt

Zvanu nosaukumi sākas ar mq_prefix

Sīkāka informācija par rindas zvaniem tiek apspriesta tālāk:

>> mq_open, mq_close

Šo funkciju izmanto, lai atvērtu POSIX rindu.

Mq_open ir funkcija, ko izmanto, lai izsauktu rindas nosaukumu. Nākamais parametrs ir karodziņš, ko izmanto ziņojumu saņemšanai. O_WRONLY tiek izmantots ziņojumu sūtīšanai, un O_RDWR tiek izmantots operāciju nosūtīšanai un saņemšanai rindā. Lietotāji var izmantot karodziņu O_NONBLOCK, lai norādītu rindu uz nebloķēšanas režīmu un mq_send un mq_receive nosūtīt un saņemt datus rindā.

Sintakse
Zemāk tiek parādīta iepriekšminētās rindas izsaukuma sintakse:

# iekļaut
/ * izmanto failu atvēršanai * /
# iekļaut
/ * lai noteiktu failu, pamatojoties uz ceļu * /
# iekļaut
/ * lai iekļautu ziņojumu rindas aprakstus * /
mqd_t mq_open (const raksturs * nosaukums, int oflag);
/ *, lai atvērtu un piekļūtu rindai * /
mqd_t mq_open (const rakstzīmes * nosaukums, int oflag, mode_t režīms,
struct mq_attribute * atribūts);

Mq_Flags: Var būt O vai nebloķēts

Mq_MaxMsg: Maksimālais ziņojumu skaits, kurus var ievadīt rindā

Mq_Msgsize: Maksimālais baitu skaits ziņojumā

Mq_CurMsgs: Pašlaik nosūtītie ziņojumi rindā

mq_close zvani: Lai aizvērtu visus rindas aprakstus.

mq_notify

Tas ir zvans, ko izmanto, lai reģistrētu un reģistrētu ierašanās paziņojumu, kad ziņojums nonāk tukšā rindā.

Sintakse

# iekļaut
/ *, lai iekļautu visus ziņojumu rindas aprakstus no koda * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * paziņot par ziņojuma pienākšanu rindā * /

mq_unlink

To izmanto, lai noņemtu rindu ar rindas_nosaukumu.

Sintakse

int mq_unlink (const char * queue_name);
/ * Lai noņemtu rindu, kuras nosaukums ir rindas_nosaukums * /

mq_getattr, mq_setattr

Šai funkcijai ir atribūtu struktūra:

struct mq_attr tiek izmantots kā ziņojumu rinda deskriptoriem.

mq_setattr tiek izmantots atribūtu iestatīšanai rindā.

Sintakse

# iekļaut
int mq_getattribute (mqd_t mqdes, struct mq_attribute * atribūts);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);

Piemērs: Klienta un servera saziņa, izmantojot POSIX

Šis ir klienta-servera komunikācijas veikšanas piemērs, izmantojot POSIX ziņojumu rindas. Šajā piemērā mums būs klienta fails un servera fails.

Mums būs divi faili: pirmais (servera) fails ir serveris.c, un otrs (klienta) fails ir klients.c.

Servera kods

Zemāk redzamajā attēlā redzams kods, kuru izmantojām klienta-servera saziņai. Pirmkārt, mēs izsaucām dažas bibliotēkas, lai definētu virknes, mainīgos un funkcijas. Tad mēs definējām fcntl funkciju un rindas servera nosaukumu. Pēc tam mēs definējām servera rindas nosaukumu, kam sekoja tā ziņojuma lielums un bufera lielums, lai noteiktu ziņojumu lielumu, kas vienlaikus būtu piemērots mūsu buferim. Pēc tam mēs piezvanījām un aprakstījām rindas, pēc tam mēs izveidojām nākamos marķierus, lai redzētu klienta atbildi, tiklīdz tā tika nosūtīta klientam. Visbeidzot, apstiprinājums tika pabeigts, izdrukājot ziņojumu no servera gala. Nākamajā sadaļā jūs redzēsiet karodziņus, kas tika apspriesti iepriekšējā sadaļā.

Mēs inicializējām visus karodziņus, ieskaitot mq_flags, mq_maxmsgs, utt. turpināt glabāt pieprasījumus. Pēc tam mēs servera nosaukumam piemērojām nosacījumu un saglabājām ziņojumus rindas buferī. Pēc tam glabāšanas laikā mēs pārliecinājāmies, ka rindas tiek ievērotas pēc prioritātes kārtulas, kura princips ir pirmais, kurš nāk. Beigās kods parāda kļūdas ziņojumu, ja no klienta gala ir saņemtas kļūdas. Visbeidzot, mēs izgājām no servera, lai nosūtītu pieprasījumu klientam.

Saglabājiet serveri.c fails

Klienta kods

Tagad mēs apspriedīsim otro failu. Zemāk redzamais attēls ir kods, ko izmantojām klienta-servera saziņai. Kods sākās, izsaucot standarta bibliotēkas un definējot mainīgo galvenes. Pēc tam mēs definējām virknes un visu veidu datus. Pēc tam mēs paziņojām par rindas galveni, lai definētu servera rindas nosaukumu. Pēc tam mēs definējām atļauju rindas un ziņojuma lielumu rindas iekšpusē, kā arī ziņojuma bufera lielumu (maksimālo izmēru, kas varētu ietilpt rindā).

Mēs aprakstīsim rindas un izveidosim jaunu klientu, lai saņemtu ziņojumus, kas nosūtīti no servera gala. Pēc tam mēs izsauksim karodziņus un inicializēsim tos, kā arī izsauksim klienta beigu funkciju. Kļūdas gadījumā tā izies no funkcijas. Vērtība tiek saglabāta buferī, un serverim tiek nosūtīta pieprasījuma atbilde. Atbildes gadījumā serveris sniegs marķieri, kas tiek izdrukāts, tiklīdz klienta gals ir ievadījis ievadi. Kļūdas gadījumā tas atgriezīs kļūdas vērtības, t.e., klients nav varējis nosūtīt ziņojumu serverim. Pēc tam mēs iziesim no klienta.

Saglabājiet klientu.c fails

Failu izpilde

Mēs izmantojam a gcc kompilators, lai izpildītu failus. Lai palaistu servera beigu failu, termināla logā ierakstiet pievienoto komandu:

$ sudo gcc serveris.c -lrt

Pēc tam ierakstiet šo:

$ ./ a.ārā

Rezultāts parādīsies šādi:

Pārejot uz klienta atbildi, ierakstiet šo:

$ sudo gcc klients.c -lrt

Pēc tam izpildiet šo:

$ ./ a.ārā

Rezultāts parādīsies šādi:

Secinājums

Šajā rakstā jūs uzzinājāt, kā nosūtīt POSIX ziņojumu rindas ar C programmēšanu, kā arī dažas tās funkcijas. Tad jūs redzējāt dažus šī procesa piemērus sīkāk.

Noderīgi rīki Linux spēlētājiem
Ja jums patīk spēlēt spēles Linux, iespējams, ka spēļu pieredzes uzlabošanai, iespējams, esat izmantojis tādas lietotnes un utilītprogrammas kā Wine, ...
HD Remastered spēles operētājsistēmai Linux, kurām nekad agrāk nebija Linux laidiena
Daudzi spēļu izstrādātāji un izdevēji nāk klajā ar veco spēļu HD remaster, lai pagarinātu franšīzes darbības laiku. Lūdzu, faniem, kas pieprasa saderī...
Kā izmantot AutoKey, lai automatizētu Linux spēles
AutoKey ir darbvirsmas automatizācijas lietderība operētājsistēmām Linux un X11, kas ieprogrammēta Python 3, GTK un Qt. Izmantojot skriptu un MACRO fu...