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
- TAGS
- procese
- pipe
- www.cs.ubbcluj.ro
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);