C programozás

Csőrendszer-hívás C-ben

Csőrendszer-hívás C-ben
cső() egy Linux rendszerfunkció. A cső() A rendszerfunkció a fájlleírók megnyitására szolgál, amelyek a különböző Linux folyamatok közötti kommunikációra szolgálnak. Röviden, a cső() függvény a folyamatok közötti kommunikációra szolgál Linux alatt.  Ebben a cikkben bemutatom, hogyan kell használni a pipe () rendszer funkciót Linux alatt. Tehát kezdjük.

All About pipe () Funkció:

A szintaxisa a cső() funkció:

int cső (int pipefd [2]);

Itt a pipe () függvény egyirányú adatcsatornát hoz létre a folyamatok közötti kommunikációhoz. Áthalad egy int (Egész) típusú tömb pipefd 2 tömb elemből áll a funkciócsőig (). Ezután a pipe () függvény két fájlleírót hoz létre a pipefd sor.

A. Első eleme pipefd sor, pipefd [0] a cső adatainak kiolvasására szolgál.

A. Második eleme pipefd sor, pipefd [1] adatok írására szolgál a csőhöz.

Siker esetén a pipe () függvény 0-t ad vissza. Ha hiba történik a cső inicializálása során, akkor a pipe () függvény -1-et ad vissza.

A pipe () függvény a fejlécben van meghatározva unistd.h. A pipe () függvény C-programban való használatához be kell illesztenie a fejlécet unistd.h alábbiak szerint:

#include

Ha többet szeretne tudni a pipe () rendszer funkciójáról, ellenőrizze a pipe () man oldalát a következő paranccsal:

$ man 2 pipe
A pipe () man oldala.

1. példa:

Az első példához hozzon létre egy új C forrásfájlt 1_pipe.c és írja be a következő kódsorokat.

#include
#include
#include
 
int main (érvénytelen)
int pipefds [2];
 
if (cső (pipefds) == -1)
perror ("cső");
kilépés (EXIT_FAILURE);

 
printf ("Fájlleíró értékének olvasása:% d \ n", pipefds [0]);
printf ("Fájlleíró érték írása:% d \ n", pipefds [1]);
 
visszatér EXIT_SUCCESS;

Ide illesztettem a pipe () fejlécfájlját unistd.h először a következő sorral.

#include

Aztán a fő() függvényt definiáltam pipefds két elemű egész tömb a következő sorral.

int pipefds [2];

Ezután lefuttattam a pipe () függvényt a fájlleíró tömb inicializálásához pipefds alábbiak szerint.

cső (pipefds)

A pipe () függvény visszatérési értékét is felhasználva ellenőriztem a hibákat. Használtam a kijárat() funkció a program lezárására abban az esetben, ha a csőfunkció meghibásodik.

if (cső (pipefds) == -1)
perror ("cső");
kilépés (EXIT_FAILURE);

Ezután kinyomtattam az olvasási és írási csőfájl leírók értékét pipefds [0] és pipefds [1] illetőleg.

printf ("Fájlleíró értékének olvasása:% d \ n", pipefds [0]);
printf ("Fájlleíró érték írása:% d \ n", pipefds [1]);

Ha futtatja a programot, akkor a következő kimenetet kell látnia. Amint láthatja, az olvasott pip fájl leíró értéke pipefds [0] van 3 és írja a pipa fájl leíróját pipefds [1] van 4.

2. példa:

Hozzon létre egy másik C forrásfájlt 2_pipe.c és írja be a következő kódsorokat.

#include
#include
#include
#include
 
int main (érvénytelen)
int pipefds [2];
char puffer [5];
 
if (cső (pipefds) == -1)
perror ("cső");
kilépés (EXIT_FAILURE);

 
char * pin = "4128 \ 0";
 
printf ("PIN írása a csővezetékbe ... \ n");
write (pipefds [1], pin, 5);
printf ("Kész.\ n \ n ");
 
printf ("PIN olvasása a csövön ... \ n");
read (pipefds [0], puffer, 5);
printf ("Kész.\ n \ n ");
 
printf ("PIN a csőből:% s \ n", puffer);
 
visszatér EXIT_SUCCESS;

Ez a program alapvetően megmutatja, hogyan kell írni a csőbe, és olvasni a csőből írt adatokat.

Itt egy 4 karakteres PIN kódot tároltam a char sor. A tömb hossza 5 (beleértve a NULL karaktert \ 0).

char * pin = "4128 \ 0";

Minden ASCII karakter 1 bájt méretű C-ben. Tehát ahhoz, hogy a 4 számjegyű PIN-kódot a csövön keresztül elküldhesse, 5 bájt (4 + 1 NULL karakter) adatot kell írnia a csőbe.

5 bájt adat megírása (csap) a csőbe, a ír() függvény az írási cső fájlleíróval pipefds [1] alábbiak szerint.

write (pipefds [1], pin, 5);

Most, hogy van néhány adat a csőben, kiolvashatom a csőből a olvas() függvény a read pipe fájlleíróban pipefds [0]. Amint írtam 5 bájt adatot (csap) a csőbe, 5 bájt adatot is felolvasok a csőből. Az elolvasott adatok a puffer karaktertömb. Mivel 5 bájt adatot fogok olvasni a csőből, a puffer a karaktertömbnek legalább 5 bájt hosszúnak kell lennie.

Meghatároztam a puffer karaktertömb a. elején fő() funkció.

char puffer [5];

Most ki tudom olvasni a PIN-kódot a csőből, és eltárolhatom a puffer tömb a következő sorral.

read (pipefds [0], puffer, 5);

Most, hogy kiolvastam a PIN-kódot a csőből, ki tudom nyomtatni a printf () a szokásos módon működik.

printf ("PIN a csőből:% s \ n", puffer);

Miután futtattam a programot, a helyes kimenet jelenik meg, amint láthatja.

3. példa:

Hozzon létre egy új C forrásfájlt 3_pipe.c írja be a következő kódsorokba.

#include
#include
#include
#include
#include
int main (érvénytelen)
int pipefds [2];
char * pin;
char puffer [5];
 
if (cső (pipefds) == -1)
perror ("cső");
kilépés (EXIT_FAILURE);

 
pid_t pid = villa ();
 
if (pid == 0) // a gyermek folyamatában
pin = "4821 \ 0"; // PIN a küldéshez
bezár (pipefds [0]); // bezár olvas fd
write (pipefds [1], pin, 5); // PIN-kód beírása a pipába
 
printf ("PIN generálása a gyermekben és elküldés a szülőnek ... \ n");
alvás (2); // szándékos késés
kilépés (EXIT_SUCCESS);

 
if (pid> 0) // a fő folyamatban
várakozás (NULL); // várja meg a gyermek folyamatának befejezését
bezár (pipefds [1]); // bezár írni fd
read (pipefds [0], puffer, 5); // PIN-kód olvasása a csőből
bezár (pipefds [0]); // bezár olvas fd
 
printf ("A szülő megkapta a (z)"% s '\ n "PIN-kódot, puffer);

 
visszatér EXIT_SUCCESS;

Ebben a példában megmutattam, hogyan kell használni a csövet a folyamatok közötti kommunikációhoz. PIN kódot küldtem a gyermek folyamatból a szülő folyamatba. Ezután olvassa el a PIN-kódot a szülő folyamat csövéből, és nyomtassa ki a szülő folyamatból.

Először hoztam létre egy gyermek folyamatot a fork () függvény segítségével.

pid_t pid = villa ();

Ezután a gyermek folyamatában (pid == 0), A PIN segítségével írtam a csőre a ír() funkció.

write (pipefds [1], pin, 5);

Miután a PIN-kód be van írva a csővezetékbe a gyermek folyamatból, a szülő folyamat (pid> 0) olvassa el a csőből a olvas() funkció.

read (pipefds [0], puffer, 5);

Ezután a szülői folyamat kinyomtatta a PIN kódot printf () a szokásos módon működik.

printf ("A szülő megkapta a (z)"% s '\ n "PIN-kódot, puffer);

Mint látható, a program futtatása megadja a várt eredményt.

4. példa:

Hozzon létre egy új C forrásfájlt 4_pipe.c írja be a következő kódsorokba.

#include
#include
#include
#include
#include
 
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
 
void getPIN (karaktertű [PIN_LENGTH + 1])
srand (getpid () + getppid ());
 
tű [0] = 49 + rand ()% 7;
 
mert (int i = 1; i < PIN_LENGTH; i++)
csap [i] = 48 + rand ()% 7;

 
pin [PIN_LENGTH] = '\ 0';

 
 
int main (érvénytelen)
míg (1)
int pipefds [2];
char pin [PIN_LENGTH + 1];
char puffer [PIN_LENGTH + 1];
 
pipa (pipefds);
 
pid_t pid = villa ();
 
if (pid == 0)
getPIN (pin); // PIN létrehozása
bezár (pipefds [0]); // bezár olvas fd
write (pipefds [1], pin, PIN_LENGTH + 1); // PIN-kód beírása a pipába
 
printf ("PIN generálása a gyermekben és elküldés a szülőnek ... \ n");
 
alvás (PIN_WAIT_INTERVAL); // szándékosan késlelteti a PIN-kód létrehozását.
 
kilépés (EXIT_SUCCESS);

 
if (pid> 0)
várakozás (NULL); // várja a gyermek befejezését
 
bezár (pipefds [1]); // bezár írni fd
read (pipefds [0], puffer, PIN_LENGTH + 1); // PIN-kód olvasása a csőből
bezár (pipefds [0]); // bezár olvas fd
printf ("A szülő megkapta a (z)"% s "PIN kódot a gyermektől.\ n \ n ", puffer);


 
visszatér EXIT_SUCCESS;

Ez a példa megegyezik a 3. példa. Az egyetlen különbség az, hogy ez a program folyamatosan létrehoz egy gyermekfolyamatot, generál egy PIN-kódot a gyermekfolyamatban, és egy cső segítségével elküldi a PIN-kódot a szülői folyamatnak.

Ezután a szülői folyamat kiolvassa a csőből a PIN-kódot, és kinyomtatja.

Ez a program PIN_WAIT_INTERVAL másodpercenként új PIN_LENGTH PIN kódot generál.

Mint látható, a program a várakozásoknak megfelelően működik.

A programot csak a gombbal állíthatja le + C.

Tehát így használja a pipe () rendszerhívást C programozási nyelven. Köszönjük, hogy elolvasta ezt a cikket.

Ezekkel az ingyenes eszközökkel adja hozzá az egérmozdulatokat a Windows 10 rendszerhez
Az elmúlt években a számítógépek és az operációs rendszerek nagymértékben fejlődtek. Volt idő, amikor a felhasználóknak parancsokkal kellett navigálni...
Az egér mozgásának vezérlése és kezelése több monitor között a Windows 10 rendszerben
Dual Display Mouse Manager lehetővé teszi az egér mozgásának vezérlését és konfigurálását több monitor között, lassítva annak mozgását a határ közeléb...
A WinMouse segítségével testre szabhatja és javíthatja az egérmutató mozgását a Windows PC-n
Ha szeretné javítani az egérmutató alapértelmezett funkcióit, használjon ingyenes programokat WinMouse. További funkciókat kínál, amelyek segítenek ab...