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

Funcţia TerminateProcess are următorul prototip:<br />

BOOL TerminateProcess (HANDLE hProcess, UINT fuExitCode);<br />

Cu această funcţie, un process poate termina orice alt proces din sistem, inclusiv pe el însu<strong>şi</strong>.<br />

Procesul terminat este dat de referinţa hProcess. Codul de retur a procesului terminat va fi<br />

setată pe valoarea parametrului fuExitCode. Folosirea funcţiei TerminateProcess poate<br />

fi periculoasă la o programare neîngrijită. In mod normal, evenimentul de terminare a unui<br />

proces este semnalat de către <strong>Windows</strong> tuturor DLL-urilor ataşate de proces. La terminarea<br />

procesului, folosind funcţia TerminateProcess, aceste DLL-uri nu vor fi avertizate,<br />

producându-se eventuale pierderi de date. <strong>Windows</strong> garantează totu<strong>şi</strong> că toate resursele<br />

sistem utilizate de proces vor fi eliberate indiferent cum este terminat procesul.<br />

<strong>1.</strong>3.3. Exemple de utilizare de procese sub <strong>Windows</strong><br />

<strong>1.</strong>3.3.<strong>1.</strong> Exemplul 3: Rezumatul directorului curent<br />

Pentru utilizare sub <strong>Windows</strong>, vom folosi ca intermediar un fisier de comenzi ls.bat, care<br />

contine o singura linie:<br />

dir %1<br />

Sursa execWin.cpp a programului este:<br />

#include <br />

#include <br />

int main() {<br />

STARTUPINFO si = { sizeof(si) };<br />

PROCESS_INFORMATION pi;<br />

// ls.bat contine linia: dir %1<br />

<strong>prin</strong>tf("Procesul parinte %d va creea un fiu\n", GetCurrentProcessId());<br />

// Rulati alternativ cu una dintre urmatoarele doua linii comentata:<br />

BOOL b = CreateProcess("ls.bat", NULL, NULL, NULL,<br />

// BOOL b = CreateProcess("ls.bat", "ls.bat *.cpp", NULL, NULL,<br />

FALSE, 0, NULL, NULL, &si, &pi);<br />

WaitForSingleObject(pi.hProcess, INFINITE);<br />

<strong>prin</strong>tf("Terminat procesul fiu %d creeat de parintele %d\n",<br />

pi.dwProcessId, GetCurrentProcessId());<br />

return 0;<br />

}<br />

Efectul compilarii si a executiei este:<br />

D:\Florin\Didactic\20102011\SO\probleme\WProc-H>gcc execWin.cpp<br />

D:\Florin\Didactic\20102011\SO\probleme\WProc-H>a<br />

Procesul parinte 2320 va creea un fiu<br />

D:\Florin\Didactic\20102011\SO\probleme\WProc-H>dir<br />

Volume in drive D is fmbData<br />

Volume Serial Number is F6C0-1474<br />

Directory of D:\Florin\Didactic\20102011\SO\probleme\WProc-H

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

Saved successfully!

Ooh no, something went wrong!