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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

In continuare, prezentăm o succesiune de 5 (cinci) pa<strong>şi</strong> ce trebuie urmaţi de orice aplicaţie<br />

<strong>Windows</strong> care foloseşte o zonă de memorie partajată:<br />

<strong>1.</strong> Crearea segmentului de memorie partajată folosind funcţia CreateFileMapping.<br />

Această operaţie se poate realiza în două moduri:<br />

a) folosind un fi<strong>şi</strong>er definit anterior de către utilizator, cu ajutorul apelurilor<br />

CreateFile sau OpenFile.<br />

b) folosind o pagină sistem, specificată cu ajutorul unui handler predefinit, cu valoarea<br />

0xFFFFFFFF.<br />

Dacă segmentul de memorie partajatăError! Bookmark not defined. există deja,<br />

deschiderea accesului la segment se obţine cu ajutorul funcţiei OpenFileMapping.<br />

Obiectul <strong>Windows</strong>, asociat segmentului de memorie partajată, poartă numele de filemapping.<br />

Atât funcţia CreateFileMapping, cât <strong>şi</strong> funcţia OpenFileMapping întorc<br />

un handle la obiectul file-mapping asociat segmentului de memorie partajată referit.<br />

2. Maparea propriu-zisă a segmentului de memorie partajată (reprezentat <strong>prin</strong> obiectul filemapping),<br />

în spaţiul de memorie al procesului curent, este realizată cu ajutorul apelului<br />

MapViewOfFile. Această funcţie întoarce un pointer la o porţiune din această memorie<br />

partajată.<br />

3. Pointerul obţinut în urma apelului precedent, permite aplicaţiei apelante să acceseze zona<br />

de memorie partajată în citire <strong>şi</strong>/sau scriere, în funcţie de parametrii specificaţi la apel.<br />

4. Operaţia complementară celei de mapare, se realizează cu autorul apelului<br />

UnmapViewOfFile. Astfel, se realizează “detaşarea” aplicaţiei curente de la segmentul de<br />

memorie partajată, <strong>prin</strong> eliberarea spaţiului de memorie ocupat <strong>prin</strong> operaţia de mapare.<br />

5. In final, închiderea handle-ului la obiectul file-mapping se realizează cu funcţia<br />

CloseHandle. De asemenea, folosind CloseHandle, se închide fi<strong>şi</strong>erul deschis cu<br />

CreateFile sau OpenFile.<br />

Crearea / deschiderea în varianta <strong>1.</strong>b, cu handle-ul special 0xFFFFFFFF permite folosirea<br />

unei singure zone partajate în sistem. Folosind numai acest handle, NU este posibil ca pe<br />

acela<strong>şi</strong> sistem să existe mai multe zone de memorie partajată. Pentru a permite ca fiecare grup<br />

de procese să-<strong>şi</strong> folosească propria zonă de memorie partajată, trebuie să se folosească<br />

crearea / deschiderea în varianta <strong>1.</strong>a, CreateFile / OpenFile. Astfel, se crează /<br />

deschide câte un fi<strong>şi</strong>er mapat în memorie pentru fiecare zonă de memorie partajată dorită.<br />

In continuare, punctăm o comparaţie, la nivel API, între operaţiile de lucru cu memorie<br />

partajată sub Unix <strong>şi</strong> sub <strong>Windows</strong>:<br />

CreateFileMapping shmget<br />

MapViewOfFile shmat<br />

UnmapViewOfFile shmdt<br />

CloseHandle shmctl<br />

Sintaxa exactă, a funcţiilor implicate în utilizarea segmentelor de memorie partajată sub<br />

<strong>Windows</strong>, va fi descrisă mai jos.<br />

HANDLE CreateFileMapping(HANDLE hFis, LPSECURITY_ATTRIBUTES descr_sec,<br />

DWORD prot, DWORD maxHigh, DWORD maxLow, LPCTSTR nume_file_mapping);

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

Saved successfully!

Ooh no, something went wrong!