Gestione dei Processi
I processi Un processo è unistanza di esecuzione di un programma. Consiste di –Un identificatore univoco (PID) –La handle table del processo tabella di riferimenti (HANDLE) a risorse di cui il processo può disporre (file, socket, eventi, …) –Uno spazio dindirizzamento privato di 4GB –Almeno un thread desecuzione
PID PID = process ID –Identificatore univoco dei processi –(visibile per esempio quando i processi sono mostrati in task manager)
Thread Un thread rappresenta un contesto di esecuzione –Valori dei registri, stack, codice eseguito, … Un processo ha almeno un thread associato e può averne più di uno (esecuzione concorrente) Il primo thread viene creato allavvio di un processo automaticamente dal SO –Il primo thread esegue il codice dellentry point del processo (funzione main)
Creazione di un processo da programma BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
Parametri di CreateProcess i/ii LPCTSTR lpApplicationName –Nome dellapplicazione (stringa) LPTSTR lpCommandLine –Linea di comando con evetuali parametri (stringa) LPSECURITY_ATTRIBUTES lpProcessAttributes LPSECURITY_ATTRIBUTES lpThreadAttributes –Attributi di sicurezza del processo e del suo primo thread BOOL bInheritHandles –ereditarietà delgli handle del padre DWORD dwCreationFlags –Modalità di creazione del processo CREATE_SUSPENDED (processo creato nello stato sospeso) CREATE_NEW_CONSOLE (processo creato in una nuova console) 0 (nessuna modalità particolare)
Parametri di CreateProcess ii/ii LPVOID lpEnvironment –Trasferisce al processo le variabili dambiente –Date sotto forma di tabella di stringhe –Ogni riga è nella forma nome=valore –Se il parametro è NULL, il nuovo processo acquisisce una tabella identica a quella del processo che lo crea LPCTSTR lpCurrentDirectory –Directoru di lavoro del nuovo processo LPSTARTUPINFO lpStartupInfo –Informazioni per la finestra principale del nuovo processo LPPROCESS_INFORMATION lpProcessInformation –È un parametro di ritorno per ricevere informazioni sul processo appena creato Handle del processo Handle del primo thread PID del nuovo processo
Struttura PROCESS_INFORMATION typedef struct _PROCESS_INFORMATION { // pi HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION; hProcess: handle del processo creato hThread: handle del thread primario del processo creato dwProcessId: PID del processo creato dwThreadId: identificatore del thread primario
Creazione di un thread HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
Parametri di Create Thread LPSECURITY_ATTRIBUTES lpThreadAttributes –Attributi di sicurezza del thread DWORD dwStackSize –Dimensione dello stack (0 = default) LPTHREAD_START_ROUTINE lpStartAddress –Funzione da eseguire nel thread LPVOID lpParameter –Parametri passati alla funzione eseguita DWORD dwCreationFlags –Stato del thread al momento della creazione 0 = running CREATE_SUSPENDED = sospeso LPDWORD lpThreadId –Identificatore del thread restituito come risultato
Funzioni passate ai thread Le funzioni passate ai thread devono essere dichiarate seguendo la seguente sintassi –DWORD WINAPI ThreadFunctionName (LPVOID lpParam); DWORD: tipo del valore di ritorno WINAPI: convenzione di chiamata ThreadFunctionName: nome della funzione (a piacere) LPVOID: puntatore a void –utilizzato come strumento generico per il passaggio dei parametri –mediante unoperazione di cast è possibile ricostruire il formato corretto dei parametri dentro la funzione
Funzioni di utilità int GetCurrentThreadId() –Restituisce lId del thread corrispondente al contesto di esecuzione corrente DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMillisecs) –Aspetta la terminazione di un thread per il tempo stabilito –(si può usare il valore INFINITE per aspettare la terminazione del thread in ogni caso)
Riferimenti Pinardi, Aruanno, Bisiani. Windows &.NET 2000 in Action – Capitolo 1