SHPORA.net :: PDA

Login:
đĺăčńňđŕöč˙

Main
FAQ

ăóěŕíčňŕđíűĺ íŕóęč
ĺńňĺńňâĺííűĺ íŕóęč
ěŕňĺěŕňč÷ĺńęčĺ íŕóęč
ňĺőíč÷ĺńęčĺ íŕóęč
Search:
Title: | Body:

c.Inchiderea pipe

La închiderea unui pipe, un proces urmează accea?i procedură ca ?i la închiderea unui fi?ier regulat, exceptând faptul că nucleul execută unele prelucrări speciale înainte de a elibera inodul pipe-ului. Astfel, el decrementează contorul corespunzător numărului de procese ce scriu ?i respectiv, citesc din pipe. Dacă numărul proceselor redactor (ce scriu în pipe) este 0 ?i sunt procese cititor (ce citesc date din pipe) blocate, nucleul le treze?te, iar ele vor încheia operaŢia de citire fără a citi date. Dacă numărul proceselor cititor este 0 ?i sunt procese redactor blocate, nucleul le treze?te ?i le trimite un semnal ce indică o condiŢie de eroare.
De?i în cazul pipe-urilor numite care au doar un cititor/redactor blocat există posibilitatea de a apare noi procese redactor sau cititor, nucleul le tratează în aceea?i manieră ca pe cele obi?nuite. Când nici un proces cititor sau redactor nu mai accesează pipe-ul, nucleul eliberează toate blocurile sale de date ?i actualizează inodul pentru a indica că pipe-ul este gol. Când eliberează inodul unui pipe obi?nuit, el eliberează ?i copia disc pentru a fi reasignată.
--Exemplu
char string[ ]= "hello";
^main()
{
^ char buf[1024];
^ char *cp1, *cp2;
^ int fds[2];
^ cp1= string;
^ cp2= buf;
^ while (*cp1)
^ *cp2++= *cp1++;
^ pipe(fds);
^ for(;;)
{
^write(fds[1], buf, 6);
^read(fds[0], buf, 6);
^ }
^}