28.01.2013 Views

1. Procese Windows; comunicaţii prin pipe şi IPC 2

1. Procese Windows; comunicaţii prin pipe şi IPC 2

1. Procese Windows; comunicaţii prin pipe şi IPC 2

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Procese</strong> <strong>Windows</strong>; <strong>comunicaţii</strong> <strong>prin</strong> <strong>pipe</strong> <strong>şi</strong> <strong>IPC</strong> - 14 -<br />

doua variantă este <strong>pipe</strong> cu nume, folosite pentru comunicarea între procese ce operează nu<br />

neapărat pe aceea<strong>şi</strong> ma<strong>şi</strong>nă <strong>Windows</strong>.<br />

<strong>1.</strong>4.<strong>1.</strong> Pipe anonim <strong>Windows</strong><br />

Ne vom ocupa mai întâi de <strong>pipe</strong> anonime, ca <strong>şi</strong> mecanism <strong>IPC</strong> în programarea concurentă sub<br />

<strong>Windows</strong>. Un <strong>pipe</strong> anonim poate fi folosit, ca <strong>şi</strong> <strong>pipe</strong>-ul de sub Unix, pentru comunicarea<br />

între procese descendente din creatorul <strong>pipe</strong>-ului. In urma creării, procesul creator obţine doi<br />

descriptori - handle - unul de citire <strong>şi</strong> altul de scriere. Procesul creator poate trimite fiilor<br />

(nepoţilor etc.) handle-urile <strong>pipe</strong>-ului, în momentul creării proceselor fii <strong>prin</strong> apeluri ale<br />

funcţiei CreateProces. Pentru ca fiul să moştenească handle-ul la <strong>pipe</strong>, părintele trebuie<br />

să seteze parametrul fInheritedHandle din apelul CreateProces, la valoarea TRUE.<br />

Un <strong>pipe</strong> fără nume se creează folosind apelul CreatePipe. Pipe-ul se închide cu ajutorul<br />

funcţiei CloseHandle. Funcţia CreatePipe creează un <strong>pipe</strong> fară nume <strong>şi</strong> are următorul<br />

prototip:<br />

BOOL CreatePipe (PHANDLE phRead,PHANDLE phWrite,<br />

LPSECURITY_ATTRIBUTES lpsa, DWORD cbPipe);<br />

Funcţia întoarce TRUE în caz de succes sau FALSE la eşec.<br />

phRead <strong>şi</strong> phWrite sunt pointerii spre cele două handle-uri (de citire <strong>şi</strong> de scriere) obţinute<br />

în urma creării.<br />

parametrul lpsa are o dublă semnficaţie: determină dacă handle-ul la <strong>pipe</strong>, returnat de<br />

funcţie poate fi moştenit în procesele fii, proprietate care are loc pentru o valoare diferită de<br />

NULL. Acela<strong>şi</strong> parametru reprezintă un descriptor de securitate. Dacă se specifică pentru<br />

acest parametru valoarea NULL, sistemul va fixa atributele de securitate implicite<br />

cbPipe specifică dimensiunea buferului rezervat pentru operaţiile de I/O <strong>prin</strong> <strong>pipe</strong>. Dacă<br />

această valoare este 0, atunci dimensiunea implicită a buferului o stabileşte sistemul de<br />

operare.<br />

Scrierea <strong>şi</strong> citirea din <strong>pipe</strong>urile anonime se face folosind funcţiile ReadFile <strong>şi</strong><br />

WriteFile, similare cu read <strong>şi</strong> write de sub Unix. Operaţiile sunt atomice. O citire va opri<br />

procesul până când va reu<strong>şi</strong> să se execute. In mod similar, o scriere va bloca procesul până<br />

când va avea suficient spaţiu în <strong>pipe</strong> pentru efectua operaţia de scriere dorită.<br />

Atât procesul creator, cât <strong>şi</strong> procesele fii care moştenesc cele două handle-uri ale <strong>pipe</strong>-ului, le<br />

pot folosi între momentul primirii lor <strong>şi</strong> momentul închiderii. Astfel, procesul creator poate<br />

începe imediat să folosească <strong>pipe</strong> <strong>prin</strong> apelurile ReadFile <strong>şi</strong> WriteFile. După creare <strong>şi</strong><br />

primirea handle-urilor, procesele fii pot să folosească la rândul lor funcţiile ReadFile <strong>şi</strong><br />

WrieFile pentru a citi sau scrie din <strong>pipe</strong>.<br />

<strong>1.</strong>4.2. Pipe cu nume sub windows<br />

Pipe cu nume este un mecanism de comunicare între două sisteme diferite, ambele fiind<br />

operaţionale pe platforme <strong>Windows</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!