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> - 23 -<br />

valoareInitiala – specifică valoarea iniţială a semaforului; trebuie să fie mai mare sau<br />

egală decât 0 <strong>şi</strong> mai mică sau egală decât valoareMaxima.<br />

valoareMaxima –indică valoarea maximă pe care o poate lua semaforul <strong>şi</strong> trebuie să fie<br />

mai mare decât 0.<br />

numeSemafor –specifică numele semaforului.<br />

Funcţia întoarce un handle la semafor, care poate fi utilizat în thread-urile fii.<br />

valoareInitiala <strong>şi</strong> valoareMaxima sunt numere nenegative. Dacă numeSemafor<br />

este un string, atunci avem de-a face cu un semafor cu nume, iar dacă această valoare este<br />

NULL avem de-a face cu semafor anonim.<br />

Se observă, că spre deosebire de semafoarele Unix, în acest caz se impune o limită superioară<br />

a valorii acestora.<br />

Odată creat un semafor cu nume, se poate face deschiderea accesului la semafor de către un<br />

proces. Deschiderea se face cu OpenSemaphore, care are prototipul:<br />

HANDLE OpenSemaphore (DWORD modDeAcces,<br />

BOOL mostenire,<br />

LPCTSTR numeSemafor);<br />

modDeAcces –indică modul de acces la semafor <strong>şi</strong> poate lua una (combinaţii):<br />

SEMAPHORE_ALL_ACCESS, SEMAPHORE_MODIFY_STATE, SYNCHRONIZE.<br />

(aceste valori pot fi restricţionate <strong>prin</strong> atribute de securitate la creare).<br />

mostenire –atribut de moştenire: indică (pentru valoarea TRUE) dacă handlerul la<br />

semafor va fi moştenit în procesele fii<br />

Orice semafor windows este caracterizat <strong>prin</strong> starea lui, care poate fi una dintre următoatele:<br />

� setat sau semnalat atunci când valoarea semaforului este strict pozitivă;<br />

� nesetat sau nesemnalat atunci când valoarea este egală cu zero.<br />

Cresterea valorii unui semafor se face <strong>prin</strong> apelul:<br />

BOOL ReleaseSemaphore(HANDLE hSemafor,<br />

LONG valoareDeAdaugat,<br />

LPLONG adresaVechiiValori );<br />

hSemafor –specifică handlerul semaforului de incrementat.<br />

valoareDeAdaugat –indică valoarea cu care se incrementează valoarea curentă a<br />

semaforului.<br />

adresaVechiiValori –specifică adresa unde va fi memorată vechea valoare a<br />

semaforului.<br />

Dacă semaforul hSemafor are valoarea maximă (specificată la creare), atunci acest apel de<br />

incrementare eşuează. De asemenea, dacă se specifică o valoare negativă pentru parametrul<br />

valoareDeAdaugat, apelul eşuează.

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

Saved successfully!

Ooh no, something went wrong!