SHPORA.net :: PDA | |
Main FAQ ăóěŕíčňŕđíűĺ íŕóęč ĺńňĺńňâĺííűĺ íŕóęč ěŕňĺěŕňč÷ĺńęčĺ íŕóęč ňĺőíč÷ĺńęčĺ íŕóęč 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); ^ } ^} |