C Programiranje

Sistemski poziv cijevi u C

Sistemski poziv cijevi u C
cijev() je funkcija Linux sustava. The cijev() sistemska funkcija koristi se za otvaranje deskriptora datoteka, koji se koriste za komunikaciju između različitih Linux procesa. Ukratko, cijev() funkcija se koristi za međuprocesnu komunikaciju u Linuxu.  U ovom članku pokazat ću vam kako koristiti funkciju pipe () sustava u Linuxu. Pa, krenimo.

Sve o cijevi () Funkcija:

Sintaksa cijev() funkcija je:

cijev int (int pipefd [2]);

Ovdje funkcija pipe () stvara jednosmjerni podatkovni kanal za međuprocesnu komunikaciju. Prolazite u int Polje tipa (Integer) pipefd koji se sastoji od 2 elementa niza u funkcijsku cijev (). Tada funkcija pipe () stvara dva deskriptora datoteka u pipefd niz.

Prvi element pipefd niz, pipefd [0] koristi se za očitavanje podataka iz cijevi.

Drugi element pipefd niz, pipefd [1] koristi se za upisivanje podataka u cijev.

Nakon uspjeha funkcija pipe () vraća 0. Ako se tijekom inicijalizacije cijevi dogodi pogreška, tada funkcija pipe () vraća -1.

Funkcija pipe () definirana je u zaglavlju unistd.h. Da biste koristili funkciju pipe () u svom C programu, morate uključiti zaglavlje unistd.h kako slijedi:

#include

Za više informacija o funkciji sustava pipe (), provjerite man stranicu pipe () sa sljedećom naredbom:

$ man 2 cijev
Priručnik stranice pipe ().

Primjer 1:

Za prvi primjer stvorite novu C izvornu datoteku 1_cijev.c i unesite sljedeće retke kodova.

#include
#include
#include
 
int main (void)
int pipefds [2];
 
if (cijev (pipefds) == -1)
perror ("cijev");
izlaz (EXIT_FAILURE);

 
printf ("Vrijednost deskriptora datoteke za čitanje:% d \ n", pipefds [0]);
printf ("Napiši vrijednost deskriptora datoteke:% d \ n", pipefds [1]);
 
povratak EXIT_SUCCESS;

Ovdje sam uključio zaglavnu datoteku pipe () unistd.h prvo sljedećim retkom.

#include

Zatim, u glavni() funkciju, definirao sam pipefds dvocjelni čitav niz sa sljedećim retkom.

int pipefds [2];

Zatim sam pokrenuo funkciju pipe () za inicijalizaciju niza deskriptora datoteka pipefds kako slijedi.

cijev (pipefds)

Također sam provjerio ima li pogrešaka koristeći povratnu vrijednost funkcije pipe (). Koristio sam Izlaz() funkcija za terminal programa u slučaju da funkcija cijevi zakaže.

if (cijev (pipefds) == -1)
perror ("cijev");
izlaz (EXIT_FAILURE);

Zatim sam ispisao vrijednost deskriptora datoteka za čitanje i pisanje cijevi pipefds [0] i pipefds [1] odnosno.

printf ("Vrijednost deskriptora datoteke za čitanje:% d \ n", pipefds [0]);
printf ("Napiši vrijednost deskriptora datoteke:% d \ n", pipefds [1]);

Ako pokrenete program, trebali biste vidjeti sljedeći izlaz. Kao što vidite, vrijednost opisnika datoteke pročitane cijevi pipefds [0] je 3 i napiši deskriptor cijevne datoteke pipefds [1] je 4.

Primjer 2:

Stvorite drugu izvornu datoteku C 2_cijev.c i unesite sljedeće retke kodova.

#include
#include
#include
#include
 
int main (void)
int pipefds [2];
pufer za char [5];
 
if (cijev (pipefds) == -1)
perror ("cijev");
izlaz (EXIT_FAILURE);

 
char * pin = "4128 \ 0";
 
printf ("Zapisivanje PIN-a u cijev ... \ n");
pisanje (pipefds [1], pin, 5);
printf ("Gotovo.\ n \ n ");
 
printf ("Čitanje PIN-a iz cijevi ... \ n");
čitanje (pipefds [0], međuspremnik, 5);
printf ("Gotovo.\ n \ n ");
 
printf ("PIN s cijevi:% s \ n", međuspremnik);
 
povratak EXIT_SUCCESS;

Ovaj vam program u osnovi pokazuje kako pisati u cijev i čitati podatke koje ste napisali iz cijevi.

Ovdje sam pohranio 4-znakovni PIN kod u ugljen niz. Duljina niza je 5 (uključujući NULL znak \ 0).

char * pin = "4128 \ 0";

Svaki ASCII znak veličine je 1 bajt u C-u. Dakle, da biste poslali četveroznamenkasti PIN kroz cijev, morate u cijev upisati 5 bajtova (4 + 1 NULL znak) podataka.

Za pisanje 5 bajtova podataka (pribadača) u cijev, upotrijebio sam pisati() funkcija pomoću deskriptora datoteke pipe pipe pipefds [1] kako slijedi.

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

Sad kad imam neke podatke u cijevi, mogu ih pročitati iz cijevi pomoću čitati() funkcija na opisu datoteke datoteke cijevi za čitanje pipefds [0]. Kao što sam napisao 5 bajtova podataka (pribadača) u cijev, također ću čitati 5 bajtova podataka iz cijevi. Čitani podaci pohranit će se u pufer niz znakova. Kako ću čitati 5 bajtova podataka iz cijevi, pufer polje znakova mora biti najmanje 5 bajtova.

Ja sam definirao pufer niz znakova na početku glavni() funkcija.

pufer za char [5];

Sada mogu pročitati PIN iz cijevi i spremiti ga u pufer niz sa sljedećim retkom.

čitanje (pipefds [0], međuspremnik, 5);

Sad kad sam pročitao PIN iz cijevi, mogu ga ispisati pomoću printf () funkcioniraju kao i obično.

printf ("PIN s cijevi:% s \ n", međuspremnik);

Jednom kad pokrenem program, prikazuje se točan izlaz kao što vidite.

Primjer 3:

Stvorite novu izvornu datoteku C 3_cijev.c kao tip u sljedećim retcima kodova.

#include
#include
#include
#include
#include
int main (void)
int pipefds [2];
char * pin;
pufer za char [5];
 
if (cijev (pipefds) == -1)
perror ("cijev");
izlaz (EXIT_FAILURE);

 
pid_t pid = vilica ();
 
if (pid == 0) // u podređenom procesu
pin = "4821 \ 0"; // PIN za slanje
zatvori (pipefds [0]); // zatvori čitanje fd
pisanje (pipefds [1], pin, 5); // upis PIN-a u cijev
 
printf ("Generiranje PIN-a u djetetu i slanje roditelju ... \ n");
spavanje (2); // namjerno kašnjenje
izlaz (EXIT_SUCCESS);

 
if (pid> 0) // u glavnom procesu
pričekati (NULL); // pričekajte da se postupak djeteta završi
zatvori (pipefds [1]); // zatvori zapisi fd
čitanje (pipefds [0], međuspremnik, 5); // očitavanje PIN-a iz cijevi
zatvori (pipefds [0]); // zatvori čitanje fd
 
printf ("Roditelj je primio PIN '% s' \ n", međuspremnik);

 
povratak EXIT_SUCCESS;

U ovom primjeru pokazao sam vam kako koristiti cijev za međuprocesnu komunikaciju. Poslao sam PIN iz podređenog procesa u nadređeni postupak pomoću cijevi. Zatim pročitajte PIN iz cijevi u nadređenom procesu i ispišite ga iz nadređenog postupka.

Prvo, kreirao sam podređeni postupak pomoću funkcije fork ().

pid_t pid = vilica ();

Zatim, u procesu djeteta (pid == 0), Napisao sam PIN na cijev koristeći pisati() funkcija.

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

Jednom kada se PIN upiše u cijev iz podređenog procesa, nadređeni postupak (pid> 0) pročitajte ga iz cijevi pomoću čitati() funkcija.

čitanje (pipefds [0], međuspremnik, 5);

Zatim je nadređeni postupak ispisao PIN pomoću printf () funkcioniraju kao i obično.

printf ("Roditelj je primio PIN '% s' \ n", međuspremnik);

Kao što vidite, pokretanje programa daje očekivani rezultat.

Primjer 4:

Stvorite novu izvornu datoteku C 4_cijev.c kao tip u sljedećim retcima kodova.

#include
#include
#include
#include
#include
 
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
 
poništi getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
 
pribadača [0] = 49 + rand ()% 7;
 
za (int i = 1; i < PIN_LENGTH; i++)
pin [i] = 48 + rand ()% 7;

 
prikvačiti [PIN_LENGTH] = '\ 0';

 
 
int main (void)
dok (1)
int pipefds [2];
čarobna igla [PIN_LENGTH + 1];
međuspremnik znakova [PIN_LENGTH + 1];
 
cijev (pipefds);
 
pid_t pid = vilica ();
 
if (pid == 0)
getPIN (pribadača); // generiranje PIN-a
zatvori (pipefds [0]); // zatvori čitanje fd
pisanje (pipefds [1], pin, PIN_LENGTH + 1); // upis PIN-a u cijev
 
printf ("Generiranje PIN-a u djetetu i slanje roditelju ... \ n");
 
spavanje (PIN_WAIT_INTERVAL); // namjerno odgađanje stvaranja PIN-a.
 
izlaz (EXIT_SUCCESS);

 
if (pid> 0)
pričekati (NULL); // čekanje da dijete završi
 
zatvori (pipefds [1]); // zatvori zapisi fd
čitanje (pipefds [0], međuspremnik, PIN_LENGTH + 1); // očitavanje PIN-a iz cijevi
zatvori (pipefds [0]); // zatvori čitanje fd
printf ("Roditelj je primio PIN '% s' od djeteta.\ n \ n ", međuspremnik);


 
povratak EXIT_SUCCESS;

Ovaj je primjer isti kao Primjer 3. Jedina je razlika u tome što ovaj program kontinuirano stvara podređeni proces, generira PIN u podređenom procesu i šalje PIN nadređenom procesu pomoću cijevi.

Nadređeni postupak tada čita PIN s cijevi i ispisuje ga.

Ovaj program generira novi PIN_LENGTH PIN svake PIN_WAIT_INTERVAL sekunde.

Kao što vidite, program radi kako se očekivalo.

Program možete zaustaviti samo pritiskom na + C.

Dakle, ovo je način na koji koristite sistemski poziv pipe () u programskom jeziku C. Hvala što ste pročitali ovaj članak.

Kako preuzeti i igrati Sid Meier's Civilization VI na Linuxu
Uvod u igru Civilization 6 moderan je pogled na klasični koncept predstavljen u seriji igara Age of Empires. Ideja je bila prilično jednostavna; započ...
Kako instalirati i igrati Doom na Linuxu
Uvod u Doom Serija Doom nastala je 90-ih nakon izlaska originalnog Dooma. To je bio trenutni hit i od tog vremena nadalje igraća serija dobila je broj...
Vulkan za korisnike Linuxa
Sa svakom novom generacijom grafičkih kartica vidimo da programeri igara pomiču granice grafičke vjernosti i dolaze na korak od fotorealizma. No, bez ...