SHPORA.net :: PDA | |
Main FAQ ãóìàíèòàðíûå íàóêè åñòåñòâåííûå íàóêè ìàòåìàòè÷åñêèå íàóêè òåõíè÷åñêèå íàóêè a.Comunicare intre proc prin.pipe,dup #include <string.h>
^char string[]=" hello word"; ^ main () ^ { ^ int count,i; ^ int to_par[2], to_chil[2]; /* pentru pipe-urile pãrintelui ?i fiului */ ^ char buff[256]; ^ pipe(to_par); ^ pipe(to_chil); ^ if(fork() ==0) { /* procesul fiu se executã aici */ ^close(0);/* închide vechea intrare standard */ ^dup(to_chil[0]);/* duplicã descriptorul de citire al pipe-lui la /* intrarea standard */ ^close(1);/* închide vechea intrare standard */ ^dup(to_par[1]); /* duplicã descriptorul de scriere al pipe la ie?irea standard */ ^close(to_par[1]); /* închide descriptorii pipe-lui nefolosiþi */ ^close(to_chil[0]); ^close(to_par 0]); ^close(to_chil[1]); ^for(;;) { ^if (count=read(0, buf, sizeof(buf)))==0) ^exit (); ^write(1, buf, count); } ^ } /* procesul pãrinte se executã aici */ close(1);/* rearanjeazã intrãrile ?i ie?irile standard */ ^dup(to_chil [1]); ^close(0); ^dup(to_par [0]); ^close(to_chil [1]); ^close(to_par [0]); ^close(to_chil [0]); ^close(to_par [1]); ^for(i=0; i<15; i++) { ^write(1, string, strlen(string)); ^read(0, buf, sizeof(buf)); } ^ } Programul mo?tene?te descriptorii de fi?iere 0 ?i 1 (intrarea ?i ie?irea standard) de la pãrintele sãu. Execuþia fiecãrui apel sistem pipe alocã în plus 2 descriptori de fi?iere în ?irurile to_par ?i to_child. Procesul executã fork ?i face o copie a contextului sãu. Procesul pãrinte închide fi?ierul sãu standard de ie?ire (descriptorul de fi?ier 1) ?i duplicã (dup) descriptorul de scriere întors de pipe pentru to_child. Deoarece primul slot liber din UFDT-ul pãrintelui este chiar acela eliberat prin apelul sistem close, nucleul copiazã descriptorul de scriere rezultat în urma executãrii apelului sistem pipe în slotul 1 al UFDT-lui ?i astfel descriptorul fi?ierului standard de ie?ire devine descriptorul de scriere al pipe-lui pentru to_child. |