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> - 25 -<br />
void Wait(HANDLE semafor) {WaitForSingleObject(semafor, INFINITE);}<br />
void Signal(HANDLE semafor) {ReleaseSemaphore(semafor, 1, NULL);}<br />
Mesaj *ReadMes(Segment *segment) {<br />
static Mesaj mesaj;<br />
mesaj.lung = segment->mesaj.lung;<br />
memcpy((char*)&mesaj+sizeof(int),<br />
(char*)segment+3*sizeof(int), mesaj.lung);<br />
return &mesaj;<br />
}<br />
void WriteMes(Segment *segment, Mesaj *pm) {<br />
segment->mesaj.lung = pm->lung;<br />
memcpy((char*)segment+3*sizeof(int),<br />
(char*)pm+sizeof(int), pm->lung);<br />
}<br />
Actiunea <strong>prin</strong>cipala a serverului este dirijata de functia parinte. Sursa parintelui este in<br />
shmparinte.cpp<br />
void parinte(Segment *segment, HANDLE semafor, HANDLE cerere) {<br />
Mesaj *pm;<br />
for ( ; ; ) {<br />
Wait(cerere); // Doarme, asteptand cereri<br />
if (segment->tip != -1) continue;<br />
}<br />
}<br />
Wait(semafor);<br />
pm = ReadMes(segment);<br />
pm = dir(pm->i, pm->s);<br />
WriteMes(segment, pm);<br />
segment->tip = 1;<br />
Signal(semafor);<br />
Actiunea <strong>prin</strong>cipala a clientului este dirijata de functia fiu. Sursa fiului este in shmfiu.cpp<br />
void fiu(Segment *segment, HANDLE semafor, HANDLE cerere) {<br />
Mesaj *pm, mesaj;<br />
char *pc,linie[MAXL];<br />
int i;<br />
for ( ; ; ) {<br />
<strong>prin</strong>tf("Dati: numar|sufix: ");<br />
pc = (char*)fgets(linie, MAXL, stdin);<br />
if (pc == NULL) break;<br />
linie[strlen(linie)-1] = '\0';<br />
pc = strstr(linie, "|");<br />
if (pc == NULL) continue;<br />
mesaj.i = atoi(linie);<br />
strcpy(mesaj.s, pc+1);<br />
mesaj.lung = PLUS + strlen(mesaj.s) + 1;<br />
Wait(semafor);<br />
segment->tip = -1; // Cerere<br />
WriteMes(segment, &mesaj);<br />
Signal(semafor);<br />
Signal(cerere); //Desteptarea<br />
for( ; segment->tip != 1; Sleep(100)); // Eventual wait<br />
Wait(semafor);<br />
pm = ReadMes(segment);<br />
segment->tip = 0; //Liber<br />
Signal(semafor);