Rörsystemsamtal i C

Pipe System Call 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 kommer jag att visa dig hur du använder pip () systemfunktionen i Linux. Så, låt oss komma igång.

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







intrör(intpipefd[2]);

Här skapar funktionen pipe () en enriktad datakanal för kommunikation mellan processer. Du passerar i en int (Heltal) typmatris pipefd bestående av 2 matriselement till funktionsröret (). Sedan skapar pip () -funktionen 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.





Vid framgång returnerar röret () -funktionen 0. Om ett fel uppstår under rörets initialisering, returnerar röret () -funktionen -1.

Funktionen pipe () 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 mansidan för röret () med följande kommando:

$ man2rör
Man -sidan av rör().

Exempel 1:

För det första exemplet, skapa en ny C -källfil 1_rör.c och skriv in följande koderader.

#omfatta
#omfatta
#omfatta

inthuvud(tomhet) {
intpipefds[2];

om(rör(pipefds) == -1) {
perror ('rör');
utgång (EXIT_FAILURE);
}

printf ('Läs filbeskrivningsvärde: %d n',pipefds[0]);
printf ('Skriv filbeskrivningsvärde: %d n',pipefds[1]);

lämna tillbakaEXIT_SUCCESS;
}

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

#omfatta

Sedan, i main () funktion definierade jag pipefds tvåelement heltalsmatris med följande rad.

intpipefds[2];

Sedan körde jag pip () -funktionen för att initiera filbeskrivningsmatrisen pipefds som följer.

rör(pipefds)

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

om(rör(pipefds) == -1) {
perror ('rör');
utgång (EXIT_FAILURE);
}

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

printf ('Läs filbeskrivningsvärde: %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 är värdet på den beskrivna filfilbeskrivningen pipefds [0] är 3 och skriva pipfilbeskrivning pipefds [1] är 4 .

Exempel 2:

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

#omfatta
#omfatta
#omfatta
#omfatta

inthuvud(tomhet) {
intpipefds[2];
rödingbuffert[5];

om(rör(pipefds) == -1) {
perror ('rör');
utgång (EXIT_FAILURE);
}

röding *stift= '4128 0';

printf ('Skriva PIN till rör ... n');
skriva(pipefds[1],stift, 5);
printf ('Gjort. n n');

printf ('Läser PIN -kod från rör ... n');
läsa(pipefds[0],buffert, 5);
printf ('Gjort. n n');

printf ('PIN -kod från röret: %s n',buffert);

lämna tillbakaEXIT_SUCCESS;
}

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

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

röding *stift= '4128 0';

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

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

skriva(pipefds[1],stift, 5);

Nu när jag har lite data i röret kan jag läsa det från röret med läsa() funktion på läsrörfilens beskrivning 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 kommer att lagras i buffert teckenmatris. Eftersom jag kommer att läsa 5 byte data från röret, kommer buffert teckenmatrisen måste vara minst 5 byte lång.

Jag har definierat buffert teckenmatris i början av main () fungera.

rödingbuffert[5];

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

läsa(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 -kod från röret: %s n',buffert);

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

Exempel 3:

Skapa en ny C -källfil 3_rör.c som typ i följande koderader.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
inthuvud(tomhet) {
intpipefds[2];
röding *stift;
rödingbuffert[5];

om(rör(pipefds) == -1) {
perror ('rör');
utgång (EXIT_FAILURE);
}

pid_t pid=gaffel();

om(pid== 0) { // i barnprocess
stift= '4821 0'; // PIN -kod att skicka
stänga(pipefds[0]); // stäng läs fd
skriva(pipefds[1],stift, 5); // skriv PIN till rör

printf ('Genererar PIN -kod för barn och skickar till förälder ... n');
sömn(2); // avsiktlig försening
utgång (EXIT_SUCCESS);
}

om(pid> 0) { // i huvudprocessen
vänta(NULL); // vänta på att barnprocessen är klar
stänga(pipefds[1]); // stäng skriva fd
läsa(pipefds[0],buffert, 5); // läs PIN -kod från röret
stänga(pipefds[0]); // stäng läs fd

printf ('Förälder fick PIN -kod'%s ' n',buffert);
}

lämna tillbakaEXIT_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älderprocessen med hjälp av en pipa. Läs sedan PIN -koden från röret i den överordnade processen och skriv ut den från den överordnade processen.

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

pid_t pid=gaffel();

Sedan, i barnprocessen ( pid == 0 ), Skrev jag PIN -koden till röret med skriva() fungera.

skriva(pipefds[1],stift, 5);

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

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

Sedan skrev den överordnade processen ut PIN -koden med printf () fungerar som vanligt.

printf ('Förälder fick PIN -kod'%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 som typ i följande koderader.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta

#define PIN_LENGTH 4
#definiera PIN_WAIT_INTERVAL 2

tomhetgetPIN(rödingstift[PIN_LENGTH+ 1]) {
srand (bli ledsen() +bli upprörd());

stift[0] = 49 + rad () % 7;

för(inti= 1;i<PIN_LENGTH;i++) {
stift[i] = 48 + rad () % 7;
}

stift[PIN_LENGTH] = ' 0';
}


inthuvud(tomhet) {
medan(1) {
intpipefds[2];
rödingstift[PIN_LENGTH+ 1];
rödingbuffert[PIN_LENGTH+ 1];

rör(pipefds);

pid_t pid=gaffel();

om(pid== 0) {
getPIN(stift); // generera PIN -kod
stänga(pipefds[0]); // stäng läs fd
skriva(pipefds[1],stift,PIN_LENGTH+ 1); // skriv PIN till rör

printf ('Genererar PIN -kod för barn och skickar till förälder ... n');

sömn(PIN_WAIT_INTERVAL); // försenar generering av PIN -kod avsiktligt.

utgång (EXIT_SUCCESS);
}

om(pid> 0) {
vänta(NULL); // väntar på att barnet ska bli klart

stänga(pipefds[1]); // stäng skriva fd
läsa(pipefds[0],buffert,PIN_LENGTH+ 1); // läs PIN -kod från röret
stänga(pipefds[0]); // stäng läs fd
printf ('Föräldern fick PIN -koden'%s 'från barnet. n n',buffert);
}
}

lämna tillbakaEXIT_SUCCESS;
}

Detta exempel är detsamma som Exempel 3 . Den enda skillnaden är att detta program kontinuerligt skapar en barnprocess, genererar en PIN -kod i barnprocessen och skickar PIN -koden till förälderprocessen med hjälp av ett pip.

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

Detta program genererar en ny PIN_LENGTH PIN -kod 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å här använder du pip () systemanropet i programmeringsspråk C. Tack för att du läste denna artikel.