C Programmering

Rörsystemanrop i C

Rörsystemanrop i C
rör() är en Linux-systemfunktion. De rör() systemfunktionen används för att öppna filbeskrivare, som används för att kommunicera mellan olika Linux-processer. Kort sagt, rör() funktionen används för kommunikation mellan processer i Linux.  I den här artikeln ska jag visa dig hur du använder rörfunktionen () i Linux. Så, låt oss komma igång.

Allt om rör () Funktion:

Syntaxen för rör() funktionen är:

int pipe (int pipefd [2]);

Här skapar röret () -funktionen en enkelriktad datakanal för kommunikation mellan processer. Du passerar i en int (Heltal) typ array pipefd bestående av två matriselement till funktionsröret (). Sedan skapar funktionen pipe () två filbeskrivare i pipefd array.

Det första elementet i pipefd array, pipefd [0] används för att läsa data från röret.

Det andra elementet i pipefd array, pipefd [1] används för att skriva data till röret.

Efter framgång returnerar funktionen pipe () 0. Om ett fel inträffar under rörinitieringen returnerar funktionen rör () -1.

Pipe () -funktionen definieras i rubriken unistd.h. För att kunna använda funktionen pipe () i ditt C-program måste du inkludera rubriken unistd.h som följer:

#omfatta

För mer information om rörets () systemfunktion, kontrollera man-sidan för röret () med följande kommando:

$ man 2 rör
Man-sidan av röret ().

Exempel 1:

För det första exemplet skapar du en ny C-källfil 1_rör.c och skriv in följande rader med koder.

#omfatta
#omfatta
#omfatta
 
int main (void)
int pipefds [2];
 
if (pipe (pipefds) == -1)
perror ("rör");
avsluta (EXIT_FAILURE);

 
printf ("Read File Descriptor Value:% d \ n", pipefds [0]);
printf ("Skriv filbeskrivningsvärde:% d \ n", pipefds [1]);
 
returnera EXIT_SUCCESS;

Här inkluderade jag rubrikfilen för röret () unistd.h först med följande rad.

#omfatta

Sedan, i huvud () funktion definierade jag pipefds tvåelement heltal array med följande rad.

int pipefds [2];

Sedan körde jag pipen () -funktionen för att initialisera filbeskrivningsarrayen pipefds som följer.

rör (pipefds)

Jag kollade också på fel med returvärdet för röret () -funktionen. Jag använde utgång() funktion för att avsluta programmet om rörfunktionen misslyckas.

if (pipe (pipefds) == -1)
perror ("rör");
avsluta (EXIT_FAILURE);

Sedan skrev jag ut värdet på läs- och skrivrörsfilbeskrivarna pipefds [0] och pipefds [1] respektive.

printf ("Read File Descriptor Value:% d \ n", pipefds [0]);
printf ("Skriv filbeskrivningsvärde:% d \ n", pipefds [1]);

Om du kör programmet bör du se följande utdata. Som du kan se värdet på den beskrivna filens filbeskrivning pipefds [0] är 3 och skriv pipfilbeskrivare pipefds [1] är 4.

Exempel 2:

Skapa en annan C-källfil 2_rör.c och skriv in följande rader med koder.

#omfatta
#omfatta
#omfatta
#omfatta
 
int main (void)
int pipefds [2];
kolbuffert [5];
 
if (pipe (pipefds) == -1)
perror ("rör");
avsluta (EXIT_FAILURE);

 
char * pin = "4128 \ 0";
 
printf ("Skriva PIN-kod till rör ... \ n");
skriv (pipefds [1], pin, 5);
printf ("Klar.\ n \ n ");
 
printf ("Läser PIN-kod från rör ... \ n");
läs (pipefds [0], buffert, 5);
printf ("Klar.\ n \ n ");
 
printf ("PIN från rör:% s \ n", buffert);
 
returnera EXIT_SUCCESS;

Detta program visar i princip hur du skriver till röret och läser de data du har skrivit från röret.

Här lagrade jag en 4-tecken PIN-kod i en röding array. Arrayens längd är 5 (inklusive NULL-tecknet \ 0).

char * pin = "4128 \ 0";

Varje ASCII-tecken är 1 byte i storlek i C. För att skicka den fyrsiffriga PIN-koden genom röret måste du skriva 5 byte (4 + 1 NULL-tecken) av data i röret.

Att skriva 5 byte data (stift) in i röret använde jag skriva() funktion med hjälp av skrivrörets filbeskrivare pipefds [1] som följer.

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

Nu när jag har några data i röret kan jag läsa det från röret med hjälp av läsa() funktion på den beskrivna filrörsbeskrivaren pipefds [0]. Som jag har skrivit 5 byte data (stift) i röret kommer jag också att läsa 5 byte data från röret. Data som läses lagras i buffert teckenuppsättning. Eftersom jag kommer att läsa 5 byte data från röret, kommer buffert teckenuppsättningen måste vara minst 5 byte lång.

Jag har definierat buffert teckenuppsättning i början av huvud () fungera.

kolbuffert [5];

Nu kan jag läsa PIN-koden från röret och lagra den i buffert array med följande rad.

läs (pipefds [0], buffert, 5);

Nu när jag har läst PIN-koden från röret kan jag skriva ut den med printf () fungerar som vanligt.

printf ("PIN från rör:% s \ n", buffert);

När jag väl har kört programmet visas rätt utdata som du kan se.

Exempel 3:

Skapa en ny C-källfil 3_rör.c skriv in följande rader med koder.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
int main (void)
int pipefds [2];
char * pin;
kolbuffert [5];
 
if (pipe (pipefds) == -1)
perror ("rör");
avsluta (EXIT_FAILURE);

 
pid_t pid = gaffel ();
 
if (pid == 0) // i underprocess
pin = "4821 \ 0"; // PIN att skicka
stäng (pipefds [0]); // stäng läs fd
skriv (pipefds [1], pin, 5); // skriv PIN-kod till röret
 
printf ("Genererar PIN i barn och skickar till förälder ... \ n");
sömn (2); // avsiktlig fördröjning
avsluta (EXIT_SUCCESS);

 
if (pid> 0) // i huvudprocessen
vänta (NULL); // vänta tills barnets process är klar
stäng (pipefds [1]); // stäng skriv fd
läs (pipefds [0], buffert, 5); // läs PIN från röret
stäng (pipefds [0]); // stäng läs fd
 
printf ("Föräldern fick PIN '% s' \ n", buffert);

 
returnera EXIT_SUCCESS;

I det här exemplet visade jag dig hur du använder rör för kommunikation mellan processer. Jag har skickat en PIN-kod från barnprocessen till föräldraprocessen med hjälp av en pipa. Läs sedan PIN-koden från röret i överordnadsprocessen och skriv ut den från överordnadsprocessen.

Först har jag skapat en barnprocess med gaffel () -funktionen.

pid_t pid = gaffel ();

Sedan i barnprocessen (pid == 0), Jag skrev PIN-koden till röret med hjälp av skriva() fungera.

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

När PIN-koden har skrivits till röret från barnprocessen, kommer föräldraprocessen (pid> 0) läs det från röret med hjälp av läsa() fungera.

läs (pipefds [0], buffert, 5);

Därefter skrev överordnadsprocessen ut PIN-koden med printf () fungerar som vanligt.

printf ("Föräldern fick PIN '% s' \ n", buffert);

Som du kan se ger det förväntade resultatet att köra programmet.

Exempel 4:

Skapa en ny C-källfil 4_rör.c skriv in följande rader med koder.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
 
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
 
ogiltig getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
 
stift [0] = 49 + rand ()% 7;
 
för (int i = 1; i < PIN_LENGTH; i++)
stift [i] = 48 + rand ()% 7;

 
stift [PIN_LENGTH] = '\ 0';

 
 
int main (void)
medan (1)
int pipefds [2];
char pin [PIN_LENGTH + 1];
char buffert [PIN_LENGTH + 1];
 
rör (pipefds);
 
pid_t pid = gaffel ();
 
if (pid == 0)
getPIN (pin); // generera PIN
stäng (pipefds [0]); // stäng läs fd
skriv (pipefds [1], pin, PIN_LENGTH + 1); // skriv PIN-kod till röret
 
printf ("Genererar PIN i barn och skickar till förälder ... \ n");
 
vila (PIN_WAIT_INTERVAL); // försenar generering av PIN avsiktligt.
 
avsluta (EXIT_SUCCESS);

 
if (pid> 0)
vänta (NULL); // väntar på att barnet ska avsluta
 
stäng (pipefds [1]); // stäng skriv fd
läs (pipefds [0], buffert, PIN_LENGTH + 1); // läs PIN från röret
stäng (pipefds [0]); // stäng läs fd
printf ("Förälder fick PIN '% s' från barnet.\ n \ n ", buffert);


 
returnera EXIT_SUCCESS;

Detta exempel är detsamma som Exempel 3. Den enda skillnaden är att det här programmet kontinuerligt skapar en underprocess, genererar en PIN-kod i underprocessen och skickar PIN-koden till föräldraprocessen med hjälp av ett rör.

Föräldraprocessen läser sedan PIN-koden från röret och skriver ut den.

Detta program genererar en ny PIN_LENGTH PIN var PIN_WAIT_INTERVAL sekund.

Som du kan se fungerar programmet som förväntat.

Du kan bara stoppa programmet genom att trycka på + C.

Så detta är hur du använder pipesystemet () i C-programmeringsspråk. Tack för att du läste den här artikeln.

Mus Markören hoppar eller rör sig slumpmässigt när du skriver in Windows 10
Markören hoppar eller rör sig slumpmässigt när du skriver in Windows 10
Om du upptäcker att muspekaren hoppar eller rör sig på egen hand, automatiskt, slumpmässigt när du skriver in Windows-bärbar dator eller dator, kan nå...
Mus Så här vänder du mus- och styrplattans rullningsriktning i Windows 10
Så här vänder du mus- och styrplattans rullningsriktning i Windows 10
Mus och Pekplattas gör inte bara datoranvändning lättare men effektivare och mindre tidskrävande. Vi kan inte föreställa oss ett liv utan dessa enhete...
Mus Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Muspekaren och markören i Windows 10 är mycket viktiga aspekter av operativsystemet. Detta kan också sägas för andra operativsystem, så i sanning är d...