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
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> - 30 -<br />
Se scriu si se citesc mesaje de aceeasi lungime (maxima).<br />
Actiunea <strong>prin</strong>cipala a serverului este dirijata de functia parinte care are doar un parametru,<br />
descriptorul mailslotului de pe server. Sursa serverului este data in fisierul<br />
msgparinte.cpp<br />
void parinte(HANDLE in) {<br />
Mesaj *pm;<br />
HANDLE out;<br />
long pid;<br />
char nume[100];<br />
for ( ; ; ) {<br />
pm = ReadMes(in);<br />
pid = pm->pid;<br />
pm = dir(pm->i, pm->s);<br />
s<strong>prin</strong>tf(nume, "\\\\.\\mailslot\\p2f%d", pid);<br />
out = CreateFile(nume, GENERIC_WRITE,<br />
FILE_SHARE_WRITE|FILE_SHARE_READ,<br />
NULL, OPEN_EXISTING, 0, NULL);<br />
WriteMes(out, pm);<br />
CloseHandle(out);<br />
}<br />
}<br />
In mod ciclic, serverul aplicatiei repeta:<br />
� Parintele asteapta (cea mai mare parte a timpului) sa citeasca un mesaj din mailslotul<br />
lui (cel ce contine cereri).<br />
� Preia din cerere PID-ul clientului.<br />
� Intocmeste lista de fisiere ceruta.<br />
� Creeaza un fisier de acces la mailslotul clientului.<br />
� Ii scrie acestuia mesajul de raspuns.<br />
� Inchide fisierul creeat.<br />
Actiunea <strong>prin</strong>cipala a clientului este dirijata de functia fiu, unde in si out sunt descriptorii<br />
celor doua mailsloturi cu care lucreaza, iar pid este PID-ul clientului. Sursa clientului este<br />
data in fisierul msgfiu.cpp<br />
void fiu(HANDLE in, HANDLE out, long pid) {<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.pid = pid;<br />
mesaj.i = atoi(linie);<br />
strcpy(mesaj.s, pc+1);<br />
mesaj.lung = PLUS + strlen(mesaj.s) + 1;<br />
WriteMes(out, &mesaj);<br />
pm = ReadMes(in);<br />
pc = pm->s;<br />
<strong>prin</strong>tf("%d\n",pm->lung);<br />
for (i = PLUS; i < pm->lung; ) {<br />
<strong>prin</strong>tf("%d %s\n", i, pc);