Caurule ir saziņas līdzeklis starp procesiem. Viens process ieraksta datus caurulē, bet cits process nolasa datus no caurules. Šajā rakstā mēs redzēsim, kā funkcija pipe () tiek izmantota, lai realizētu koncepciju, izmantojot C valodu.
Par Pipe
Caurulē dati tiek uzturēti FIFO secībā, kas nozīmē secīgu datu ierakstīšanu vienā caurules galā un datu nolasīšanu no cita caurules gala tādā pašā secīgā secībā.
Ja kāds process tiek lasīts no caurules, bet neviens cits process vēl nav ierakstīts caurulē, tad lasīšana atgriež faila beigas. Ja process vēlas ierakstīt caurulē, bet lasīšanai nav pievienots cits process, kas ir pievienots caurulei, tas ir kļūdas stāvoklis, un caurule ģenerē SIGPIPE signālu.
Galvenes fails
# iekļautSintakse
int caurule (int filedes [2])Argumenti
Šai funkcijai ir nepieciešams viens arguments, divu veselu skaitļu masīvs (filedes). filedes [0] tiek izmantots lasīšanai no caurules, un filedes [1] tiek izmantots, lai rakstītu uz pīpi. Procesam, kuru vēlas nolasīt no caurules, vajadzētu beigties filedes [1], un process, kas vēlas rakstīt uz caurules, ir jāaizver filedes [0]. Ja nevajadzīgie caurules gali nav skaidri aizvērti, faila beigas (EOF) nekad netiks atgrieztas.
Atgriezties vērtības
Pēc panākumiem caurule () atgriež 0, par neveiksmi funkcija atgriež -1.
Attēlā mēs varam attēlot caurule () darbojas šādi:
Zemāk ir daži piemēri, kas attēlo, kā izmantot cauruļu funkciju C valodā.
1. piemērs
Šajā piemērā mēs redzēsim, kā darbojas caurules funkcija. Lai gan caurules izmantošana vienā procesā nav ļoti noderīga, taču mēs iegūsim ideju.
// Piemērs1.c# iekļaut
# iekļaut
# iekļaut
# iekļaut
int main ()
int n;
int filedes [2];
char buferis [1025];
char * message = "Sveika, pasaule!";
caurule (filedes);
rakstīt (filedes [1], ziņa, strlen (ziņa));
ja ((n = lasīt (filedes [0], buferis, 1024))> = 0)
buferis [n] = 0; // izbeigt virkni
printf ("lasīt% d baitus no caurules:"% s "\ n", n, buferis);
cits
perror ("lasīt");
izeja (0);
Šeit mēs vispirms esam izveidojuši cauruli, izmantojot caurule () funkcija pēc tam tiek ierakstīta caurulē, izmantojot fildes [1] beigas. Pēc tam dati ir nolasīti, izmantojot caurules otru galu, kas ir filedes [0]. Lai lasītu un rakstītu failā, mēs to izmantojām lasīt () un rakstīt () funkcijas.
2. piemērs
Šajā piemērā mēs redzēsim, kā vecāku un bērnu procesi sazinās, izmantojot cauruli.
// Piemērs2.c# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
int main ()
int filedes [2], nbaiti;
pid_t childpid;
char string [] = "Sveika, pasaule!\ n ";
char readbuffer [80];
caurule (filedes);
ja (((bērns = dakša ()) == -1)
perror ("dakša");
izeja (1);
ja (childpid == 0)
aizvērt (filedes [0]); // Bērna procesam šis caurules gals nav vajadzīgs
/ * Nosūtiet "virkni" caurules izejas pusē * /
rakstīt (filedes [1], virkne, (strlen (virkne) +1));
izeja (0);
cits
/ * Vecāku process aizver caurules izejas pusi * /
aizvērt (filedes [1]); // Vecākajam procesam šis caurules gals nav vajadzīgs
/ * Lasiet virknē no caurules * /
nbaiti = lasīt (filedes [0], readbuffer, sizeof (readbuffer));
printf ("Lasīt virkni:% s", lasīšanas buferis);
atgriešanās (0);
Pirmkārt, izmantojot caurules funkciju, ir izveidota viena caurule, pēc tam ir izveidots bērna process. Pēc tam bērna process aizver lasīšanas galu un raksta caurulē. Vecāku process aizver rakstīšanas beigas, nolasa no caurules un parāda to. Datu plūsma šeit ir tikai viens no bērna vecākiem.
Secinājums:
caurule () ir spēcīgs sistēmas izsaukums Linux. Šajā rakstā mēs esam redzējuši tikai vienvirziena datu plūsmu, viens process raksta un cits process skan, izveidojot divas caurules, mēs varam sasniegt arī divvirzienu datu plūsmu.