Volver al temario
Tema 03 · 54 páginas

La gestión de procesos

Tema completo Modo estudio
TEXTO ORIGINAL · Páginas 3637 Ver PDF

4.2.1. La creacion y la destruccion de procesos

Texto íntegro de la conversión. Las figuras y la disposición de las notas se pueden consultar en el PDF.

4.2.1. La creación y la destrucción de procesos

Lo más destacable con respecto a la gestión de procesos en Windows es que este sistema sigue un modelo explícito de paso de parámetros. Es decir, en el momento en el que se realiza la llamada para pedir la creación de un proceso hay que especificar explícitamente los elementos que formarán el entorno de ejecución del nuevo proceso. El nuevo proceso hijo no será por lo tanto una copia del padre, como sucede en UNIX. Una consecuencia de eso es que la llamada de Windows para invocar la creación de un proceso (CreateProcess) tiene 9 parámetros. Recordemos que la llamada equivalente de UNIX (fork) no recibe ni un solo parámetro, ya que en el caso de UNIX el proceso hijo es, en el momento de su creación, una copia idéntica del padre. Algunas de las llamadas relacionadas con la gestión de procesos se muestran en la tabla siguiente:

Operación

Crear_proceso + Cargar_imagen Destruir_proceso Esperar_finalización Quiensoy

En este apartado mostramos algunos ejemplos o partes de ejemplos extraídos de la web MSDN que ilustran la creación de procesos, la sincronización y la redirección de la E/S. En los ejemplos observamos cómo se pueden ajustar objetos mediante sus manejadores (handles).

El primer ejemplo muestra cómo se puede crear un proceso en Windows y cómo se puede sincronizar con la finalización del hijo. Se puede observar cómo se inicializan las estructuras de datos de tipo STARTUPINFO y PROCESS_INFORMATION y cómo se hacen los llamadas CreateProcess y WaitForSingleObject. El proceso hijo ejecutará el programa que se indique como parámetro al ejecutar el proceso padre.

#include <windows.h> #include <stdio.h>

#include <tchar.h>

void _tmain( int argc, TCHAR *argv[])

Notas y pies de figura de la fuente

Llamadas Windows Web recomendada CreateProcess Podéis encontrar más información en la web de ayuda ExitProcess a los desarrolladores de Microsoft (MSDN), en la par- WaitForSingleObject o WaitForMultipleObjects te de procesos y flujos. Actualmente la URL es http:// msdn.microsoft.com/en-us/ GetCurrentProcessId library/ms684841.

Página 37

{ STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si));

si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi));

if( argc != 2) {

printf("Usage: %s [cmdline]\n, argv[0]); return; }

// Start the child process. if( !CreateProcess( NULL // No module name (use command line)

argv[1], // Command line NULL // Process handle not inheritable NULL // Thread handle not inheritable

FALSE // Set handle inheritance to FALSE 0 // No creation flags NULL // Use parent's environment block

NULL // Use parent's starting directory &si // Pointer to STARTUPINFO structure &pi) // Pointer to PROCESS_INFORMATION structure

) { printf( "CreateProcess failed (%d).\n, GetLastError());

return; }

// Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE);

// Close process and thread handles. CloseHandle( pi.hProcess);

CloseHandle( pi.hThread);

}

Ver fragmento extraído sin normalizar
4.2.1.  La creación y la destrucción de procesos


Lo más destacable con respecto a la gestión de procesos en Windows es que
este sistema sigue un modelo explícito de paso de parámetros. Es decir, en el
momento en el que se realiza la llamada para pedir la creación de un proceso
hay que especificar explícitamente los elementos que formarán el entorno de
ejecución del nuevo proceso. El nuevo proceso hijo no será por lo tanto una
copia del padre, como sucede en UNIX. Una consecuencia de eso es que la
llamada de Windows para invocar la creación de un proceso (CreateProcess)
tiene 9 parámetros. Recordemos que la llamada equivalente de UNIX (fork)
no recibe ni un solo parámetro, ya que en el caso de UNIX el proceso hijo
es, en el momento de su creación, una copia idéntica del padre. Algunas de
las llamadas relacionadas con la gestión de procesos se muestran en la tabla
siguiente:



             Operación                                   Llamadas Windows                                Web recomendada

Crear_proceso + Cargar_imagen          CreateProcess                                                   Podéis encontrar más infor-
                                                                                                       mación en la web de ayuda
Destruir_proceso                       ExitProcess                                                     a los desarrolladores de Mi-
                                                                                                       crosoft (MSDN), en la par-
Esperar_finalización                   WaitForSingleObject o WaitForMultipleObjects                    te de procesos y flujos. Ac-
                                                                                                       tualmente la URL es http://
                                                                                                       msdn.microsoft.com/en-us/
Quiensoy                               GetCurrentProcessId                                             library/ms684841.


En este apartado mostramos algunos ejemplos o partes de ejemplos extraídos
de la web MSDN que ilustran la creación de procesos, la sincronización y la
redirección de la E/S. En los ejemplos observamos cómo se pueden ajustar
objetos mediante sus manejadores (handles).


El primer ejemplo muestra cómo se puede crear un proceso en Windows
y cómo se puede sincronizar con la finalización del hijo. Se puede obser-
var cómo se inicializan las estructuras de datos de tipo STARTUPINFO y
PROCESS_INFORMATION y cómo se hacen los llamadas CreateProcess y
WaitForSingleObject. El proceso hijo ejecutará el programa que se indique
como parámetro al ejecutar el proceso padre.


    #include <windows.h>
    #include <stdio.h>

    #include <tchar.h>


    void _tmain( int argc, TCHAR *argv[])

## Página 37

<!-- source-page: 37 -->

GNUFDL • PID_00214802                                                                                  37                                                                                                      La gestión de procesos


    {
      STARTUPINFO si;

      PROCESS_INFORMATION pi;


      ZeroMemory( &si, sizeof(si));

      si.cb = sizeof(si);
      ZeroMemory( &pi, sizeof(pi));


      if( argc != 2)
      {

        printf("Usage: %s [cmdline]\n, argv[0]);
        return;
      }


      // Start the child process.
      if( !CreateProcess( NULL // No module name (use command line)

        argv[1], // Command line
        NULL // Process handle not inheritable
        NULL // Thread handle not inheritable

        FALSE // Set handle inheritance to FALSE
        0 // No creation flags
        NULL // Use parent's environment block

        NULL // Use parent's starting directory
        &si // Pointer to STARTUPINFO structure
        &pi) // Pointer to PROCESS_INFORMATION structure

      )
      {
        printf( "CreateProcess failed (%d).\n, GetLastError());

        return;
      }


      // Wait until child process exits.
      WaitForSingleObject( pi.hProcess, INFINITE);


      // Close process and thread handles.
      CloseHandle( pi.hProcess);

      CloseHandle( pi.hThread);


    }


Descargar Markdown originalEstudiar este apartado