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> - 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);

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

Saved successfully!

Ooh no, something went wrong!