C Programmeerimine

Torusüsteemi kõne C-s

Torusüsteemi kõne C-s
toru () on Linuxi süsteemi funktsioon. The toru () süsteemi funktsiooni kasutatakse failide kirjeldajate avamiseks, mida kasutatakse erinevate Linuxi protsesside vahel suhtlemiseks. Lühidalt öeldes toru () funktsiooni kasutatakse protsessidevaheliseks suhtlemiseks Linuxis.  Selles artiklis näitan teile, kuidas kasutada Linuxi funktsiooni pipe (). Alustame siis.

Kõik toru kohta () Funktsioon:

Süntaks toru () funktsioon on:

int toru (int pipefd [2]);

Siin loob funktsioon pipe () protsesside vahelise suhtluse jaoks ühesuunalise andmekanali. Sa läbid int (Integer) tüüpi massiiv pipefd koosneb 2 massiivi elemendist funktsioonitorule (). Seejärel loob funktsioon pipe () kaks faili kirjeldajat pipefd massiiv.

Esimene element pipefd massiiv, pipefd [0] kasutatakse torust andmete lugemiseks.

Programmi teine ​​element pipefd massiiv, pipefd [1] kasutatakse torusse andmete kirjutamiseks.

Edu korral tagastab funktsioon pipe () 0. Kui toru initsialiseerimise ajal ilmneb viga, tagastab funktsioon pipe () -1.

Funktsioon pipe () on määratletud päises unistd.h. Funktsiooni pipe () kasutamiseks oma C-programmis peate lisama päise unistd.h järgnevalt:

# kaasata

Toru () süsteemi funktsiooni kohta lisateabe saamiseks kontrollige toru () käsulehte järgmise käsuga:

$ mees 2 toru
Toru manuleht ().

Näide 1:

Esimese näite jaoks looge uus C lähtefail 1_toru.c ja sisestage järgmised koodiread.

# kaasata
# kaasata
# kaasata
 
int main (tühine)
int pipefds [2];
 
kui (toru (pipefds) == -1)
perror ("toru");
väljumine (EXIT_FAILURE);

 
printf ("Loe failikirjuri väärtus:% d \ n", pipefds [0]);
printf ("Kirjutage failikirjuri väärtus:% d \ n", pipefds [1]);
 
tagastage EXIT_SUCCESS;

Lisasin siia toru () päisefaili unistd.h kõigepealt järgmise reaga.

# kaasata

Siis peamine () funktsiooni määratlesin pipefds kahe elemendiga täisarvuline massiiv järgmise reaga.

int pipefds [2];

Seejärel käivitasin faili kirjeldajate massiivi lähtestamiseks funktsiooni pipe () pipefds järgnevalt.

toru (pipefds)

Kontrollisin ka toru () funktsiooni tagastusväärtust vigade osas. Ma kasutasin väljumine () funktsioon programmi lõpetamiseks juhuks, kui toru funktsioon ebaõnnestub.

kui (toru (pipefds) == -1)
perror ("toru");
väljumine (EXIT_FAILURE);

Seejärel printisin torufailide kirjeldajate loetud ja kirjutatud väärtuse pipefds [0] ja piibud [1] vastavalt.

printf ("Loe failikirjuri väärtus:% d \ n", pipefds [0]);
printf ("Kirjutage failikirjuri väärtus:% d \ n", pipefds [1]);

Programmi käivitamisel peaksite nägema järgmist väljundit. Nagu näete, on loetud torufaili kirjeldaja väärtus pipefds [0] on 3 ja kirjutage torufaili kirjeldaja piibud [1] on 4.

Näide 2:

Looge teine ​​C-lähtefail 2_toru.c ja sisestage järgmised koodiread.

# kaasata
# kaasata
# kaasata
# kaasata
 
int main (tühine)
int pipefds [2];
söpuhver [5];
 
kui (toru (pipefds) == -1)
perror ("toru");
väljumine (EXIT_FAILURE);

 
char * pin = "4128 \ 0";
 
printf ("PIN-koodi kirjutamine torusse ... \ n");
kirjutama (pipefds [1], pin, 5);
printf ("Valmis.\ n \ n ");
 
printf ("PIN-koodi lugemine torust ... \ n");
loe (pipefds [0], puhver, 5);
printf ("Valmis.\ n \ n ");
 
printf ("PIN torust:% s \ n", puhver);
 
tagastage EXIT_SUCCESS;

See programm näitab teile põhimõtteliselt, kuidas torusse kirjutada ja torust kirjutatud andmeid lugeda.

Siia salvestasin 4-märgise PIN-koodi a char massiiv. Massiivi pikkus on 5 (sh märk NULL \ 0).

char * pin = "4128 \ 0";

Iga ASCII tähemärk on C-s 1-baidine. 4-kohalise PIN-koodi saatmiseks toru kaudu peate torusse kirjutama 5 baiti (4 + 1 NULL-tähemärki).

5 baiti andmete kirjutamiseks (tihvt) torusse, kasutasin kirjutama () funktsioon, kasutades kirjutustoru faili kirjeldajat piibud [1] järgnevalt.

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

Nüüd, kui torus on andmeid, saan neid torust lugeda, kasutades loe () funktsioon toru loetud faili kirjeldajal pipefds [0]. Nagu ma olen kirjutanud 5 baiti andmeid (tihvt) torusse, loen torust ka 5 baiti andmeid. Loetud andmed salvestatakse puhver tähemass. Kuna loen torust 5 baiti andmeid, siis puhver tähemassiiv peab olema vähemalt 5 baiti pikk.

Olen määratlenud puhver tähemärkide massiiv peamine () funktsioon.

söpuhver [5];

Nüüd saan torust PIN-koodi välja lugeda ja salvestada puhver massiiv järgmise reaga.

loe (pipefds [0], puhver, 5);

Nüüd, kui PIN-kood torust on läbi loetud, saan selle printida printf () toimida nagu tavaliselt.

printf ("PIN torust:% s \ n", puhver);

Kui olen programmi käivitanud, kuvatakse õige väljund, nagu näete.

Näide 3:

Looge uus C lähtefail 3_toru.c järgmistesse koodiridadesse.

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
int main (tühine)
int pipefds [2];
char * tihvt;
söpuhver [5];
 
kui (toru (pipefds) == -1)
perror ("toru");
väljumine (EXIT_FAILURE);

 
pid_t pid = kahvel ();
 
if (pid == 0) // lapse protsessis
pin = "4821 \ 0"; // PIN saatmiseks
sulgema (pipefds [0]); // sulge loetud fd
kirjutama (pipefds [1], pin, 5); // kirjuta torusse PIN-kood
 
printf ("Lapse PIN-koodi genereerimine ja vanemale saatmine ... \ n");
uni (2); // tahtlik viivitus
väljumine (EXIT_SUCCESS);

 
if (pid> 0) // põhiprotsessis
ootama (NULL); // oodake, kuni lapse protsess lõpeb
sulgema (pipefds [1]); // sulgege kirjutage fd
loe (pipefds [0], puhver, 5); // loe torust PIN-koodi
sulgema (pipefds [0]); // sulge loetud fd
 
printf ("Vanem sai PIN-i '% s' \ n", puhver);

 
tagastage EXIT_SUCCESS;

Selles näites näitasin teile, kuidas kasutada toru protsessidevaheliseks suhtlemiseks. Olen saatnud toru abil lapseprotsessist PIN-koodi vanemprotsessi. Seejärel lugege vanemprotsessi torust saadud PIN-kood ja printige see vanemaprotsessist.

Esiteks olen loonud lapse protsessi, kasutades funktsiooni fork ().

pid_t pid = kahvel ();

Seejärel lapse protsessis (pid == 0), Kirjutasin torule PIN-koodi kasutades kirjutama () funktsioon.

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

Kui PIN-kood on alamprotsessist torusse kirjutatud, on vanemprotsess (pid> 0) lugege seda torust, kasutades loe () funktsioon.

loe (pipefds [0], puhver, 5);

Seejärel printis vanemprotsess PIN-koodi kasutades printf () toimida nagu tavaliselt.

printf ("Vanem sai PIN-i '% s' \ n", puhver);

Nagu näete, annab programmi käivitamine oodatud tulemuse.

Näide 4:

Looge uus C lähtefail 4_toru.c järgmistesse koodiridadesse.

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
 
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
 
void getPIN (tähtnõel [PIN_LENGTH + 1])
srand (getpid () + getppid ());
 
tihvt [0] = 49 + rand ()% 7;
 
jaoks (int i = 1; i < PIN_LENGTH; i++)
tihvt [i] = 48 + rand ()% 7;

 
pin [PIN_LENGTH] = '\ 0';

 
 
int main (tühine)
samas (1)
int pipefds [2];
süsiniknõel [PIN_LENGTH + 1];
söpuhver [PIN_LENGTH + 1];
 
toru (pipefds);
 
pid_t pid = kahvel ();
 
kui (pid == 0)
getPIN (pin); // genereeri PIN-kood
sulgema (pipefds [0]); // sulge loetud fd
kirjutama (pipefds [1], pin, PIN_LENGTH + 1); // kirjuta torusse PIN-kood
 
printf ("Lapse PIN-koodi genereerimine ja vanemale saatmine ... \ n");
 
uni (PIN_WAIT_INTERVAL); // PIN-i genereerimise viivitamine tahtlikult.
 
väljumine (EXIT_SUCCESS);

 
if (pid> 0)
ootama (NULL); // lapse lõpetamise ootamine
 
sulgema (pipefds [1]); // sulgege kirjutage fd
loe (pipefds [0], puhver, PIN_LENGTH + 1); // loe torust PIN-koodi
sulgema (pipefds [0]); // sulge loetud fd
printf ("Vanem sai lapselt PIN-koodi% s".\ n \ n ", puhver);


 
tagastage EXIT_SUCCESS;

See näide on sama mis Näide 3. Ainus erinevus on see, et see programm loob pidevalt lapseprotsessi, genereerib alamprotsessis PIN-koodi ja saadab toru abil vanemaprotsessile PIN-koodi.

Seejärel loeb vanemprotsess torust PIN-koodi ja prindib selle välja.

See programm genereerib uue PIN_LENGTH PIN-koodi iga PIN_WAIT_INTERVAL sekundi järel.

Nagu näete, töötab programm ootuspäraselt.

Programmi saate peatada ainult vajutades + C.

Niisiis, kasutate C (programmeerimiskeeles) süsteemi (. Täname selle artikli lugemise eest.

Viis parimat ergonoomilist arvutihiiretoodet Linuxile
Kas pikaajaline arvuti kasutamine põhjustab valu randmes või sõrmedes?? Kas teil on liigeste jäikus ja peate pidevalt käsi suruma? Kas tunnete põletav...
How to Change Mouse and Touchpad Settings Using Xinput in Linux
Most Linux distributions ship with “libinput” library by default to handle input events on a system. It can process input events on both Wayland and X...
X-Mouse Button Control abil saate hiire nupud erinevates tarkvarades erinevalt ümber teha
Võib-olla vajate tööriista, mis võiks muuta teie hiire juhtimissüsteemi iga kasutatava rakendusega. Sel juhul võite proovida rakendust nimega X hiiren...