C programozás

POSIX üzenetsorok C programozással

POSIX üzenetsorok C programozással

POSIX folyamatok közötti kommunikáció (IPC)

Az IPC-t valós idejű kiterjesztésekhez használják. Ezek az üzenetsorok a Linux részét képezik. Ezeket a hívásokat standardként használják, de a modern verziók részei lehetnek. Ezeket a hívásokat sokkal tisztább kezelőfelülettel lehet egyszerűen megvalósítani.

POSIX üzenetsorok Linux alatt

A Linux rendszer V-üzenetsorait a használatával megszerzett kulcsok segítségével azonosítják ftok hívások. Ezek a POSIX üzenetsorok általában név karakterláncokat használnak. Linux rendszerekben a POSIX sorokat karakterláncoknak nevezzük. Úgy tekintjük, hogy ezek a karakterláncok a / -vel kezdődnek, majd más karakterekkel rendelkeznek.  Azok a folyamatok, amelyek követik és ismerik a várólista nevét megfelelő jogokkal, üzeneteket küldhetnek vagy fogadhatnak a várólistára és onnan. Ez segít a fontos funkciók végrehajtásában.

Mik azok a POSIX üzenetsor hívások?

A POSIX üzenetsoroknak kapcsolódniuk kell minden olyan könyvtárhoz, amelyik valóban kilép. Az alábbiakban néhány használt hívást mutatunk be:

A librt a fordító -lrt parancsát használja

A hívásnevek az mq_prefix paranccsal kezdődnek

A várólista-hívások részleteit az alábbiakban tárgyaljuk:

>> mq_open, mq_close

Ez a funkció a POSIX várólista megnyitására szolgál.

Az Mq_open egy olyan függvény, amely a sor nevének hívására szolgál. A következő paraméter az üzenetek fogadására használt zászló. Az O_WRONLY az üzenetek küldésére, az O_RDWR pedig a soron belüli műveletek küldésére és fogadására szolgál. A felhasználók az O_NONBLOCK jelzővel megadhatják a várakozási sort a nem blokkoló módhoz és mq_send és mq_receive adatokat várakozási sorban küldeni és fogadni.

Szintaxis
A fenti várakozási sor szintaxisa az alábbiakban jelenik meg:

#include
/ * a fájlok megnyitásához használt * /
#include
/ * fájl meghatározása az elérési út alapján * /
#include
/ * az üzenetsor leírások hozzáadásához * /
mqd_t mq_open (const karakter * név, int oflag);
/ * a sor megnyitásához és a sor eléréséhez * /
mqd_t mq_open (const karakter * név, int oflag, mode_t mód,
struct mq_attribute * attribútum);

Mq_Flags: Lehet O vagy nem blokkolt

Mq_MaxMsg: A sorba beírható üzenetek maximális száma

Mq_Msgsize: Egy üzenet maximális bájtja

Mq_CurMsgs: Jelenleg küldött üzenetek egy sorban

mq_close hívások: Az összes sorleíró bezárása.

mq_notify

Ez egy hívás, amelyet az érkezési értesítés regisztrálásához és regisztrációjának törléséhez használnak, amikor egy üzenet üres sorba kerül.

Szintaxis

#include
/ * az üzenetsor összes leírását tartalmazza a kódból * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * értesíteni az üzenet érkezését a sorban * /

mq_unlink

Arra szolgál, hogy eltávolítsa a queue_name nevű sort.

Szintaxis

int mq_unlink (const char * queue_name);
/ * A (z) sornévvel rendelkező sor eltávolítása

mq_getattr, mq_setattr

Ennek a funkciónak attribútumszerkezete van:

A struct mq_attr üzenetsorként szolgál a leírókhoz.

Az mq_setattr a soron belüli attribútumok beállítására szolgál.

Szintaxis

#include
int mq_getattribute (mqd_t mqdes, struct mq_attribute * attribútum);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);

Példa: kliens-szerver kommunikáció POSIX-on keresztül

Az alábbiakban bemutatunk egy példát az ügyfél-szerver kommunikációra POSIX üzenetsorokon keresztül. A példában kliens- és szerverfájlunk lesz.

Két fájlunk lesz: az első (szerver) fájl az szerver.c, a másik (kliens) fájl pedig ügyfél.c.

Szerver kód

Az alábbi képen látható a kód, amelyet az ügyfél-szerver kommunikációhoz használtunk. Először hívtunk néhány könyvtárat a karakterláncok, változók és függvények meghatározására. Ezután meghatároztuk a fcntl függvény és a sorkiszolgáló neve. Ezt követően meghatároztuk a kiszolgáló várólistájának nevét, majd annak üzenetméretét és pufferméretét, hogy meghatározzuk az üzenetek méretét, hogy egyszerre illeszkedjenek a pufferünkhöz. Ezután felhívtuk és leírtuk a sorokat, majd előállítottuk a következő tokeneket, hogy lássuk az ügyfél választ, miután elküldtük az ügyfélnek. Végül a megerősítést az üzenet kiszolgáló végéről történő kinyomtatásával fejezték be. A következő részben láthatja a korábbi szakaszban tárgyalt zászlókat.

Inicializáltuk az összes zászlót, beleértve mq_flags, mq_maxmsgs, stb. hogy folytassa a kérések tárolását. Ezután a kiszolgáló nevére alkalmaztuk a feltételt, és az üzeneteket a várakozási pufferben tároltuk. Ezt követően, a tárolás idején, biztosítottuk, hogy a várakozási sorok sorrendben kövessék az elsőbbségi sorrendű prioritási szabályt. A végén a kód hibaüzenetet jelenít meg, ha bármilyen hiba érkezett az ügyfélvégtől. Végül kiléptünk a szerverről, hogy elküldjük a kérést az ügyfélnek.

Mentse a szervert.c fájl

Ügyfélkód

Most megvitatjuk a második fájlt. Az alább látható kép az ügyfél-szerver kommunikációhoz használt kód. A kód a standard könyvtárak meghívásával és a változó fejlécek meghatározásával kezdődött. Ezután meghatároztuk a karakterláncokat és minden típusú adatot. Ezt követően deklaráltuk a sor fejlécét, hogy meghatározzuk a kiszolgálói sor nevét. Ezután meghatároztuk az engedélyezési sorokat és az üzenet méretét a soron belül, valamint az üzenetpuffer méretét (a soron belül elférő maximális méret).

Leírjuk a sorokat, és létrehozunk egy új klienst a szerver végéről küldött üzenetek fogadására. Ezután felhívjuk a zászlókat, inicializáljuk őket, és meghívjuk a kliens-vég funkciót. Hiba esetén kilép a funkcióból. Az érték a puffer belsejében tárolódik, és a kiszolgálónak kérési választ küld. Válasz esetén a szerver megadja a tokent, amelyet kinyomtatnak, miután az ügyfél vége megadta a bemenetet. Hiba esetén visszaadja a hibaértékeket, azaz.e., az ügyfél nem tudott üzenetet küldeni a szervernek. Ezt követően kilépünk az ügyfélből.

Mentse az ügyfelet.c fájl

A fájlok végrehajtása

A gcc fordító a fájlok végrehajtására. A kiszolgáló végfájljának futtatásához írja be a mellékelt parancsot a terminál ablakába:

$ sudo gcc szerver.c -lrt

Ezután írja be a következőt:

$ ./ a.ki

A kimenet a következőképpen jelenik meg:

Az ügyfél válaszára való továbblépéshez írja be a következőt:

$ sudo gcc kliens.c -lrt

Ezután futtassa a következőt:

$ ./ a.ki

A kimenet a következőképpen jelenik meg:

Következtetés

Ebben a cikkben megtanulta, hogyan lehet POSIX üzenetsorokat küldeni C programozással, valamint annak egyes funkcióival. Ezután részletesebben látott néhány példát erre a folyamatra.

A legjobb játékkonzol emulátorok Linuxhoz
Ez a cikk felsorolja a Linux számára elérhető népszerű játékkonzol-emulációs szoftvereket. Az emuláció egy szoftver-kompatibilitási réteg, amely játék...
A legjobb Linux-disztribútorok játékhoz 2021-ben
A Linux operációs rendszer hosszú utat tett meg eredeti, egyszerű, szerver alapú kinézetétől. Ez az operációs rendszer rendkívül javult az elmúlt évek...
Hogyan lehet rögzíteni és streamelni a játékmenetét Linuxon
Korábban a játékokat csak hobbinak tekintették, de az idő múlásával a játékipar hatalmas növekedést ért el a technológia és a játékosok száma szempont...