Volver al temario
Tema 03 · 54 páginas

La gestión de procesos

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

4.1.2. Los cambios del entorno que configura un proceso

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

4.1.2. Los cambios del entorno que configura un proceso

En UNIX hemos visto que cualquier cambio que se quiera hacer en un proceso se debe llevar a cabo una vez éste se haya creado. El cambio de ejecutable y los cambios en las entradas/salidas hechos a posteriori de la llamada fork permiten controlar por programa y, de manera flexible, tener acceso a un abanico muy amplio de posibilidades que difícilmente se podrían haber previsto a priori desde el SO. Para ilustrar este hecho nos fijaremos en el intérprete de comandos de UNIX (shell) y en los redireccionamientos que permite. Antes, sin embargo, analizaremos los puntales de esta flexibilidad, que son los elementos siguientes:

  • La llamada fork, que ya hemos visto.
  • La llamada exec de cambio de ejecutable.
  • La llamada dup de entrada/salida, que permite manipular los file descriptors.

A continuación veremos cómo los dos últimos elementos nos permiten modificar el entorno que configura un proceso.

  1. El cambio de ejecutable

La llamada exec al sistema de UNIX permite cambiar la imagen o el ejecutable que contiene un proceso. De hecho, hay toda una familia de funciones que se suelen referenciar bajo el nombre exec, que son diferentes formas de invocar la llamada a sistema execve. En concreto, las funciones son: execl, execlp, execle, execv, execvp.

El cambio que tiene lugar mediante la llamada exec no afectó a los elementos que configuran el proceso, como el entorno de entrada/salida. En general, sólo afecta a la programación de las señales y al dominio de protección si el fichero ejecutable que se debe cargar tiene activo el bit setuid o el setgid. Los bits setuid y setgid hacen que durante la ejecución del programa el proceso que lo ha cargado cambie respectivamente al dominio del usuario propietario, o al del grupo del usuario propietario del fichero ejecutable. Estos derechos permiten construir aplicaciones que acceden de manera controlada a bases de datos o a ficheros en general sobre los que no se quiere dar un derecho de escritura generalizado.

  1. La manipulación de los file descriptors

La llamada dup permite duplicar el valor de una entrada concreta de la tabla de file descriptors en la primera posición libre que se encuentre dentro de la tabla.

Con esta operación se pueden modificar fácilmente los valores asociados a los file descriptors estándares.

Notas y pies de figura de la fuente

Ved también Podéis ver la programación de las señales en el subapartado 3.2 del módulo didáctico "Comunicación y sincronización" y el cambio de dominio de usuario por parte del proceso en el subapartado 5.1 del módulo didáctico "El sistema de ficheros".

Página 33

Veamos un ejemplo de uso de la llamada dup en combinación con la llamada exec:

int estado, descFichero, pid; ...

pid = fork(); switch(pid) { case 0: /* Código del hijo. */

descFichero = open("fitxer",O_RDONLY); if (descFichero == -1) {

/tratamiento del error/ } ...

close(0); dup(descFichero); close(descFichero);

... execl("/bin/comando","comando",0); ...

/tratamiento del error/ ... case -1: /* La llamada fork ha fallado. */

... /tratamiento del error/ ...

default: /* Código del padre. */ while(pid != wait(&estat)); }

...

El código anterior podría ser el que ejecuta el intérprete de comandos dada la orden siguiente: $ comando < fichero.

En este caso sólo se muestra el trozo de código que, una vez leída la orden desde el terminal, ejecuta el comando. Esta ejecución se efectúa en la modalidad de primer plano. Ahora veremos los diferentes pasos de esta ejecución.

En primer lugar, el intérprete crea el proceso hijo que tendrá que ejecutar el comando. Una vez creada se debe realizar el redireccionamiento de la entrada estándar a fin de que cuando se cargue el programa comando se encuentre el redireccionamiento hecho. Para hacerlo, se crea un file descriptor vinculado a fichero con la llamada open (descFichero). Con open se ocupa la primera entrada libre de la tabla de los file descriptors.

Las figuras siguientes ilustran la evolución de las tablas internas del sistema durante este proceso:

Página 34

a) Situación después de abrir fichero:

Figura 11

Para redireccionar la entrada estándar desde fichero se debe conseguir que el file descriptor 0 esté asociado al fichero. Para hacerlo, desasignamos el dispositivo lógico asociado al file descriptor 0 y, mediante la llamada dup, lo volvemos a asignar copiando sobre su entrada en la tabla de los file descriptors la entrada asociada a descFichero. Así, los dos file descriptors hacen referencia a la misma sesión de trabajo abierta sobre fichero.

b) Situación después de haber ejecutado la llamada dup:

Figura 12

Falta eliminar, mediante la llamada close, el file descriptor descFichero para conseguir el entorno de entrada/salida que debe encontrar el comando que hay que ejecutar.

Después, el proceso hijo puede cargar el nuevo ejecutable mediante la llamada exec15.

c) Situación después de haber cargado el ejecutable del comando:

Notas y pies de figura de la fuente

(15)En el ejemplo se utiliza execl, que es una de las diferentes formas de esta llamada. Ved también En los recursos del Aula disponéis de material adicional con ejemplos de programas UNIX, que utilizan estas llamadas al sistema.

Página 35

. . .

Figura 13

Ver fragmento extraído sin normalizar
4.1.2.  Los cambios del entorno que configura un proceso


En UNIX hemos visto que cualquier cambio que se quiera hacer en un proceso
se debe llevar a cabo una vez éste se haya creado. El cambio de ejecutable y
los cambios en las entradas/salidas hechos a posteriori de la llamada fork per-
miten controlar por programa y, de manera flexible, tener acceso a un abani-
co muy amplio de posibilidades que difícilmente se podrían haber previsto a
priori desde el SO. Para ilustrar este hecho nos fijaremos en el intérprete de
comandos de UNIX (shell) y en los redireccionamientos que permite. Antes,
sin embargo, analizaremos los puntales de esta flexibilidad, que son los ele-
mentos siguientes:


•    La llamada￿fork, que ya hemos visto.
•    La llamada￿exec de cambio de ejecutable.
•    La llamada￿dup de entrada/salida, que permite manipular los file descrip-
     tors.


A continuación veremos cómo los dos últimos elementos nos permiten mo-
dificar el entorno que configura un proceso.


1)￿El￿cambio￿de￿ejecutable


La llamada exec al sistema de UNIX permite cambiar la imagen o el ejecutable
que contiene un proceso. De hecho, hay toda una familia de funciones que se
suelen referenciar bajo el nombre exec, que son diferentes formas de invocar
la llamada a sistema execve. En concreto, las funciones son: execl, execlp,
execle, execv, execvp.


El cambio que tiene lugar mediante la llamada exec no afectó a los elementos                               Ved también
que configuran el proceso, como el entorno de entrada/salida. En general, sólo
afecta a la programación de las señales y al dominio de protección si el fichero                            Podéis ver la programación de
                                                                                                            las señales en el subapartado
ejecutable que se debe cargar tiene activo el bit setuid o el setgid. Los bits setuid                       3.2 del módulo didáctico "Co-
                                                                                                            municación y sincronización" y
y setgid hacen que durante la ejecución del programa el proceso que lo ha                                   el cambio de dominio de usua-
cargado cambie respectivamente al dominio del usuario propietario, o al del                                 rio por parte del proceso en el
                                                                                                            subapartado 5.1 del módulo
grupo del usuario propietario del fichero ejecutable. Estos derechos permiten                               didáctico "El sistema de fiche-
                                                                                                            ros".
construir aplicaciones que acceden de manera controlada a bases de datos o
a ficheros en general sobre los que no se quiere dar un derecho de escritura
generalizado.


2)￿La￿manipulación￿de￿los￿file descriptors


La llamada dup permite duplicar el valor de una entrada concreta de la tabla de
file descriptors en la primera posición libre que se encuentre dentro de la tabla.


Con esta operación se pueden modificar fácilmente los valores asociados a los
file descriptors estándares.

## Página 33

<!-- source-page: 33 -->

GNUFDL • PID_00214802                                                                                  33                                                                                                      La gestión de procesos

Veamos un ejemplo de uso de la llamada dup en combinación con la llamada
exec:


    int estado, descFichero, pid;
    ...

    pid = fork();
    switch(pid) {
    case 0:     /* Código del hijo. */

         descFichero = open("fitxer",O_RDONLY);
         if (descFichero == -1) {

         /*tratamiento del error*/
         }
         ...

         close(0);
         dup(descFichero);
         close(descFichero);

         ...
         execl("/bin/comando","comando",0);
         ...

         /*tratamiento del error*/
         ...
    case -1:    /* La llamada fork ha fallado. */

         ...
         /*tratamiento del error*/
         ...

    default:    /* Código del padre. */
         while(pid != wait(&estat));
    }

    ...


El código anterior podría ser el que ejecuta el intérprete de comandos dada la
orden siguiente: $ comando < fichero.


En este caso sólo se muestra el trozo de código que, una vez leída la orden desde
el terminal, ejecuta el comando. Esta ejecución se efectúa en la modalidad de
primer plano. Ahora veremos los diferentes pasos de esta ejecución.


En primer lugar, el intérprete crea el proceso hijo que tendrá que ejecutar el
comando. Una vez creada se debe realizar el redireccionamiento de la entrada
estándar a fin de que cuando se cargue el programa comando se encuentre el
redireccionamiento hecho. Para hacerlo, se crea un file descriptor vinculado a
fichero con la llamada open (descFichero). Con open se ocupa la primera
entrada libre de la tabla de los file descriptors.


Las figuras siguientes ilustran la evolución de las tablas internas del sistema
durante este proceso:

## Página 34

<!-- source-page: 34 -->

GNUFDL • PID_00214802                                                                                  34                                                                                                      La gestión de procesos

a) Situación después de abrir fichero:



























    Figura 11

Para redireccionar la entrada estándar desde fichero se debe conseguir que el
file descriptor 0 esté asociado al fichero. Para hacerlo, desasignamos el disposi-
tivo lógico asociado al file descriptor 0 y, mediante la llamada dup, lo volvemos
a asignar copiando sobre su entrada en la tabla de los file descriptors la entrada
asociada a descFichero. Así, los dos file descriptors hacen referencia a la mis-
ma sesión de trabajo abierta sobre fichero.


b) Situación después de haber ejecutado la llamada dup:



























    Figura 12

Falta eliminar, mediante la llamada close, el file descriptor descFichero para
conseguir el entorno de entrada/salida que debe encontrar el comando que
hay que ejecutar.

Después, el proceso hijo puede cargar el nuevo ejecutable mediante la llamada                                       (15)En el ejemplo se utiliza execl,
exec15.                                                                                                             que es una de las diferentes formas
                                                                                                                    de esta llamada.

c) Situación después de haber cargado el ejecutable del comando:                                                     Ved también


                                                                                                                       En los recursos del Aula dispo-
                                                                                                                       néis de material adicional con
                                                                                                                       ejemplos de programas UNIX,
                                                                                                                       que utilizan estas llamadas al
                                                                                                                       sistema.

## Página 35

<!-- source-page: 35 -->

GNUFDL • PID_00214802                                                                                  35                                                                                                      La gestión de procesos









                         .
                         .
                         .













    Figura 13

Descargar Markdown originalEstudiar este apartado