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:
#omfattaFör mer information om rörets () systemfunktion, kontrollera man-sidan för röret () med följande kommando:
$ man 2 rörMan-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.
#omfattaSedan, 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å
Så detta är hur du använder pipesystemet () i C-programmeringsspråk. Tack för att du läste den här artikeln.