Sie sind auf Seite 1von 11

Prctica 9 Procesos e hilos en Windows

INSTITUTO POLITCNICO NACIONAL


ESCUELA SUPERIOR DE CMPUTO

Prctica 9: Procesos e hilos en Windows

Integrantes: Morales Vzquez Mariano Prez lvarez Juan Carlos Profesor: Corts Galicia Jorge

Materia: Sistemas Operativos

Grupo: 2CM8

Mx. D.F. Noviembre/2011


2CM8 Pgina 1

Prctica 9 Procesos e hilos en Windows


Objetivo El alumno conocer y aplicar la creacin de procesos e hilos en el sistema operativo Windows a travs de la programacin de aplicaciones bsicas. Introduccin Una aplicacin consiste de uno o ms procesos. Un proceso es en trminos simples, un programa en ejecucin. Un hilo es la unidad bsica en la cual el sistema operativo designa tiempo de procesador. Un hilo puede ejecutarse en cualquier parte del cdigo del proceso, incluyendo partes que son ejecutadas por otros procesos. El comando para ejecutar un nuevo proceso es CreateProcess() :

Syntax
BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation );

Desarrollo 1. Inicie sesin en Windows 2. Para esta prctica se utilizara el ambiente de programacin Dev C/C++ 3. Capture y compile el programa de creacin de un nuevo proceso que a continuacin se muestra:
#include <stdio.h> #include <windows.h> int main(int argc,char *argv[]){ STARTUPINFO si; PROCESS_INFORMATION pi; int i; ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi,sizeof(pi)); if ( argc != 2 ){ printf("Usar: %s\n",argv[0]); return 1; }

2CM8

Pgina 2

Prctica 9 Procesos e hilos en Windows


if ( !CreateProcess(NULL,argv[1],NULL,NULL,FALSE,0,NULL,NULL,&si,&pi) ){ printf("Fallo al invocar CreateProcess(%d)\n",GetLastError() ); return 1; } printf("Soy el padre\n"); WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }

4. Capture y compile el programa que contendr al proceso hijo que a continuacin se muestra:
#include <windows.h> #include <stdio.h> int main(){ printf("Soy el hijo\n"); exit(0); }

5. Ejecute el primer cdigo pasando como argumento el nombre del archivo ejecutable del segundo cdigo capturado. Observe el funcionamiento del programa, reporte sus observaciones y experimente con el cdigo.

El primer programa, el proceso padre llama al hijo a travs de la funcin CreateProcess()

2CM8

Pgina 3

Prctica 9 Procesos e hilos en Windows


6. Compare y reporte tanto las diferencias como similitudes que encuentra con respecto a la creacin de procesos en Linux

A diferencia de sistemas operativos Linux, en Windows es un poco ms complicada la tarea de crear un nuevo proceso, debido a la manera en la que hay que llamar al programa. De manera similar a Linux, existe la funcin WaitForSingleObject() que espera a que los nodos hijo terminen su tarea.
7. Programe una aplicacin que cree un proceso hijo a partir de un proceso padre, el hijo creado a su vez creara tres hijos ms. A su vez cada uno de los tres procesos creara dos procesos ms. Cada uno de los procesos imprimir en pantalla su identificador.
/* Proceso padre */ #include <stdio.h> #include <windows.h> int main(int argc,char *argv[]){ STARTUPINFO si; PROCESS_INFORMATION pi; int i; ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi,sizeof(pi)); if ( !CreateProcess(NULL, "hijo" ,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi) ){ printf("Fallo al invocar CreateProcess(%d)\n",GetLastError() ); return 1; } printf("1. Mi PID es %d\n", GetCurrentProcessId()); WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } /* Crea tres procesos ms */ #include <windows.h> #include <stdio.h> int main(){ STARTUPINFO si; PROCESS_INFORMATION pi; int i; int j;

2CM8

Pgina 4

Prctica 9 Procesos e hilos en Windows


printf("2. Mi PID es %d\n", GetCurrentProcessId()); for ( j = 0 ; j < 3 ; j++ ){ ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi,sizeof(pi)); if ( !CreateProcess(NULL, "dos" ,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi) ){ printf("Fallo al invocar CreateProcess(%d)\n",GetLastError() ); return 1; } WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } return 0; } /* Crea dos procesos ms */ #include <windows.h> #include <stdio.h> int main(){ STARTUPINFO si; PROCESS_INFORMATION pi; int i; int j; printf("3. Mi PID es %d\n", GetCurrentProcessId()); for ( j = 0 ; j < 2 ; j++ ){ ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi,sizeof(pi)); if ( !CreateProcess(NULL, "final" ,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi) ){ printf("Fallo al invocar CreateProcess(%d)\n",GetLastError() ); return 1; } WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } return 0; }

2CM8

Pgina 5

Prctica 9 Procesos e hilos en Windows


/* Proceso final */ #include <windows.h> #include <stdio.h> int main(){ printf("4. Mi PID es %d\n", GetCurrentProcessId()); return 0; }

8. Capture, compile y ejecute el siguiente programa de creacin de hilos. Observe su funcionamiento.


#include <stdio.h> #include <windows.h> DWORD WINAPI funcionHilo(LPVOID lpParam); typedef struct Informacion info; struct Informacion{ int val_1,val_2; }; int main(){ DWORD idHilo; HANDLE manHilo; info argumentos; argumentos.val_1 = 10; argumentos.val_2 = 100; manHilo = CreateThread(NULL,0, funcionHilo ,&argumentos, 0 , &idHilo ); WaitForSingleObject(manHilo,INFINITE); printf("Valires al salir del Hilo: %d %d\n",argumentos.val_1,argumentos.val_2); CloseHandle(manHilo); return 0; } DWORD WINAPI funcionHilo(LPVOID lpParam) { info *datos = (info *)lpParam;

2CM8

Pgina 6

Prctica 9 Procesos e hilos en Windows


printf("Valores al entrar al hilo: %i %i\n",datos->val_1,datos>val_2); datos->val_1 *= 2 ; datos->val_2 *= 2; return 0; }

9. Programe una aplicacin que cree un proceso hijo a partir de un proceso padre, el hijo creado a su vez creara tres hilos (hilos padre). Cada uno de los tres hilos padre creara dos hilos ms (hilos hijo). Cada uno de los hilos hijo imprimir en pantalla el mensaje que sea enviado por su hilo padre correspondiente, cada uno de los hilos padre enviara mensaje diferente a sus hilos hijos. 10. Programe una aplicacin que cree tres hilos. El primer hilo se encargar de contabilizar las ocurrencias de una cadena dentro de un archivo especifico y devolver el resultado al programa principal; el segundo hilo copiara los archivos de su directorio actual a un subdirectorio que usted elija devolviendo al programa principal el nmero de archivos copiados; el tercer hilo generara un archivo donde se reportaran los resultados devueltos por los otros dos hilos. Cdigo fuente:
#include <stdio.h> #include <string.h> #include <windows.h> DWORD WINAPI buscaPalabras(LPVOID lpParam); DWORD WINAPI copiaFicheros(LPVOID lpParam); DWORD WINAPI escribeReporte(LPVOID lpParam); typedef struct ParamBusqueda busqueda; typedef struct ParamSubdir subdir; typedef struct ParamMakefile make; struct ParamBusqueda{ char fileName[100]; char search[100]; int ocurrencias; }; struct ParamSubdir{ char folderNameOr[100]; char folderNameDest[100]; int files; }; struct ParamMakefile{ int ocurrencias; int files; };

2CM8

Pgina 7

Prctica 9 Procesos e hilos en Windows


int main(){ DWORD idHilo; HANDLE manHilo1; HANDLE manHilo2; HANDLE manHilo3; busqueda param; subdir param2; make param3; strcpy(param.fileName,"texto.txt"); strcpy(param.search ,"hola"); manHilo1 = CreateThread(NULL,0, buscaPalabras ,&param, 0 , &idHilo ); strcpy(param2.folderNameOr,"origen"); strcpy(param2.folderNameDest,"destino"); manHilo2 = CreateThread(NULL,0, copiaFicheros ,&param2 , 0 , &idHilo ); WaitForSingleObject(manHilo1,INFINITE); WaitForSingleObject(manHilo2,INFINITE); param3.files = param2.files; param3.ocurrencias = param.ocurrencias; CloseHandle(manHilo1); CloseHandle(manHilo2); manHilo3 = CreateThread(NULL,0, escribeReporte ,&param3 , 0 , &idHilo ); WaitForSingleObject(manHilo3,INFINITE); CloseHandle(manHilo3); return 0; } DWORD WINAPI buscaPalabras(LPVOID lpParam) { int BUFFER_SIZE = 10000; char buffer[BUFFER_SIZE]; int cont = 0; FILE *ent; busqueda *param = (busqueda *)lpParam; int longitud = strlen(param->search); ent = fopen(param->fileName,"r"); while ( !feof(ent) ){ int i = 0; fgets(buffer,BUFFER_SIZE,ent); for ( i = 0 ; i < strlen(buffer) - longitud + 1 ; i++ ){ if ( !strncmp( &buffer[i] , param->search , longitud) ) cont++; } } param->ocurrencias = cont; return 0; } DWORD WINAPI escribeReporte(LPVOID lpParam){ make *param = (make *)lpParam; FILE *sal = fopen("reporte.txt","w");

2CM8

Pgina 8

Prctica 9 Procesos e hilos en Windows


fprintf(sal, "Hubo %d ocurrencias en el archivo\n",param>ocurrencias); fprintf(sal, "Se copiaron %d archivos\n",param->files); fclose(sal); return 0; } DWORD WINAPI copiaFicheros(LPVOID lpParam){ int cont = 0; WIN32_FIND_DATA findFileData; HANDLE hFind; subdir *param = (subdir *)lpParam; strcat (param->folderNameOr,"\\*"); strcat (param->folderNameDest,"\\"); hFind = FindFirstFile( param->folderNameOr , &findFileData); CreateDirectory( param->folderNameDest , NULL ); if (hFind == INVALID_HANDLE_VALUE) printf("Ruta incorrecta\n"); else { // Listamos todos los ficheros restantes while (FindNextFile(hFind, &findFileData) != 0){ if ( strlen(findFileData.cFileName) > 2 ) { char origen[200]; char destino[200]; printf("Copiado: %s\n", findFileData.cFileName ); strcpy( origen , param->folderNameOr ); origen[strlen(origen)-1] = '\0'; strcat( origen , findFileData.cFileName ); strcpy( destino , param->folderNameDest ); strcat( destino, findFileData.cFileName ); CopyFile ( origen, destino, FALSE ); cont++; } } } param->files = cont; return 0; }

Antes de ejecutarlo:

2CM8

Pgina 9

Prctica 9 Procesos e hilos en Windows

Despus de ejecutarlo:

Anlisis Crtico La creacin de procesos en entornos Windows es un poco ms engorrosa que en Linux, pero nos ofrece una plataforma que parece ser bastante estable para la elaboracin de aplicaciones que necesiten la creacin de procesos e hilos.

2CM8

Pgina 10

Prctica 9 Procesos e hilos en Windows


Conclusiones A travs de esta prctica, se conocieron los mtodos para la creacin de procesos e hilos dentro de sistemas operativos Windows. A diferencia de su contraparte, en Linux creemos que es un poco ms sencillo de implementar este tipo de acciones, de una manera ms sencilla en cuanto a cdigo y en general, la manera de implementarlo.
Bibliografa

Windows Dev Center Desktop. Processes and Threads. [En lnea] Disponible en

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684841(v=VS.85).aspx Aspectos bsicos de los procesos. Universidad de Oviedo, Espaa. http://www.atc.uniovi.es/telematica/2ac/Apuntes-y-Ejercicios/T08-Procesos.pdf

2CM8

Pgina 11

Das könnte Ihnen auch gefallen