SHPORA.net :: PDA

Login:
ðåãèñòðàöèÿ

Main
FAQ

ãóìàíèòàðíûå íàóêè
åñòåñòâåííûå íàóêè
ìàòåìàòè÷åñêèå íàóêè
òåõíè÷åñêèå íàóêè
Search:
Title: | Body:

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.