You are on page 1of 4

Programacin Concurrente: Mecanismos de Comunicacin entre Procesos

MDULO II: PROGRAMACIN CONCURRENTE


2. COMPILACIN Y EJECUCIN DE PROGRAMAS C. 3. LLAMADAS DEL SISTEMA RELACIONADAS CON LOS PROCESOS.

1.-

Compilacin de programas en C.

Un programa en C se escribe mediante un editor, y si se desea que el fichero que contiene el programa informe del lenguaje de programacin usado debe tener la extensin .c. Para compilarlo se usa la orden gcc que es el compilador de C. La sintaxis es: gcc nombre_fichero dando como resultado un fichero denominado a.out que ser el ejecutable. Si se quiere que el ejecutable tenga otro nombre distinto se usar la opcin -o del compilador de la siguiente forma: gcc -o nombre_fichero_ejecutable nombre_fichero_compilar Este compilador no se detiene al encontrar el primer error, sino que contina mientras puede.

2.-

Llamadas del sistema relacionadas con los procesos.


2.1.- Creacin de procesos: fork.

La llamada al sistema fork () es la nica que permite crear un nuevo proceso. El proceso que invoca a fork () se llama proceso padre y el proceso creado es el proceso hijo. El contenido del proceso hijo es idntico al contenido del proceso padre. El nuevo proceso hereda algunas de las caractersticas del antiguo proceso, tales como el identificador de usuario y de grupo, la prioridad, etc., pero no el identificador del proceso que ser distinto para el proceso hijo, puesto que se le asigna uno nuevo. El proceso hijo comienza su ejecucin mientras que el proceso padre continua la suya, por la siguiente instruccin despus del fork (). Una llamada fork() devuelve dos valores, uno por proceso; es decir, devuelve un cero al proceso hijo y un valor distinto de cero (el identificador del proceso hijo) al proceso padre. Si la llamada a fork () falla, devolver el valor -1 al proceso padre. El siguiente ejemplo muestra el uso de est llamada al sistema. #include <stdio.h> void main () { int pid; if ( ( pid = fork ( ) ) == -1 ) { printf ( Error en la llamada a fork ); }

rea de Lenguajes y Sistemas Informticos (E.G.R.)

Pg. 1

Programacin Concurrente: Mecanismos de Comunicacin entre Procesos

else if ( pid == 0 ) { /* Cdigo que va a ejecutar el proceso hijo. */ printf ( "Soy el proceso hijo" ); } else { /* Cdigo que va a ejecutar el proceso padre. */ printf ("Soy el proceso padre"); } } 2.2.- Terminacin de procesos: exit y wait. Una situacin muy tpica es que cuando un proceso crea a otro, el proceso padre se quede esperando a que termine el hijo antes de continuar su ejecucin. Un ejemplo de esta situacin es la forma de operar de los intrpretes de rdenes. Cuando se escribe una orden, el shell arranca un proceso para ejecutar dicha orden y no devuelve el control hasta que no se ha ejecutado completamente. Para poder sincronizar los procesos padre e hijo, se emplean las llamadas exit y wait. La llamada al sistema exit (estado) finaliza la ejecucin de un proceso y devuelve el valor de estado al sistema. Si el proceso padre del que ejecuta la llamada a exit (estado) esta ejecutando una llamada a wait (estado), se le notifica la terminacin de su proceso hijo y se le envan los 8 bits menos significativos de estado. Exit (estado) es una de las pocas llamadas que no devuelve ningn valor. Es lgico, ya que el proceso que la llama deja de existir despus de haberla ejecutado. La llamada al sistema wait (estado) suspende la ejecucin del proceso que la invoca hasta que su proceso hijo haya terminado. Estado es la variable donde se va a almacenar el valor que el proceso hijo le enva al proceso padre mediante la llamada a exit (estado) y que da idea de la condicin de finalizacin del proceso hijo. Exit (estado) y wait (estado) se suelen usar para conseguir que el proceso padre espere a la terminacin de su proceso hijo. Una secuencia de cdigo para realizar esta operacin puede ser: #include <stdio.h> void main () { int estado, pid; if ( ( pid = fork ( ) ) == -1 ) { printf ( Se ha producido un error en la creacin del proceso hijo ); } else if ( pid == 0 ) } printf (" Soy el proceso hijo ");

rea de Lenguajes y Sistemas Informticos (E.G.R.)

Pg. 2

Programacin Concurrente: Mecanismos de Comunicacin entre Procesos

sleep ( 5 ); exit ( 10 ); } else { wait (&estado); printf (" Soy el proceso padre "); printf (" El proceso hijo devuelve", estado ); } } Se puede observar en el ejemplo que el proceso padre espera hasta que el proceso hijo termine su ejecucin y luego continua. Esta llamada al sistema es la que usa el proceso del Shell que se genera cuando el usuario se conecta con el entorno. 2.3.- Informacin sobre procesos. Existen un conjunto de llamadas al sistema necesarias para conocer y fijar algunos de los parmetros de un proceso, las cuales describen cmo se relaciona el proceso con el resto del sistema. 2.3.1.- Identificadores de proceso. Todo proceso tiene asociados dos nmeros desde el momento de su creacin: el identificador de proceso y el identificador del proceso padre. El identificador de proceso (PID) es un nmero entero positivo que acta a modo de nombre del proceso. El identificador del proceso padre (PPID) es el PID del proceso que ha creado al actual. El PID de un proceso no cambia durante el tiempo de vida de ste; sin embargo, su PPID s puede variar. Esta situacin se da cuando el proceso padre muere, pasando el PPID del proceso hijo a tomar el valor 1. Para conocer los valores de PID y PPID se utilizan las llamadas getpid ( ) y getppid ( ). Es decir, son llamadas al sistema que devuelven al proceso que las solicita el identificador de l mismo y el identificador del proceso padre respectivamente. Estas llamadas nunca van a fallar. El objetivo de conocer el identificador de un proceso o el de su padre, estriba en la necesidad que tienen los procesos de conectarse entre s mediante diversos mecanismos de comunicacin. Tarea para la cual es imprescindible conocer ambos valores. En este Sistema Operativo, los procesos van a estar agrupados en conjuntos de procesos que tienen alguna caracterstica comn (por ejemplo, tener un mismo proceso padre). A estos conjuntos se les conoce como grupos de procesos y desde el sistema son controlados a travs de un identificador de grupo de procesos. Para conocer a qu grupo pertenece un proceso, se utiliza la llamada getpgrp ( ). El identificador de grupo de procesos es heredado por los procesos hijo despus de una llamada a fork ( ), pero tambin puede cambiarse creando un nuevo grupo de

rea de Lenguajes y Sistemas Informticos (E.G.R.)

Pg. 3

Programacin Concurrente: Mecanismos de Comunicacin entre Procesos

procesos. Esto se consigue con la llamada setpgrp ( ). Esta llamada hace que el proceso actual se convierta en el lder de un grupo de procesos. El identificador de este grupo va a coincidir con el PID del proceso que realiza la llamada y es el valor devuelto por ella. Si la llamada falla, devolver el valor -1. El ejemplo siguiente muestra un programa que crea un proceso hijo. Los procesos padre e hijo van a mostrar su PID, PPID y su identificador de grupo de procesos. Pasados 5 segundos, el proceso padre va a morir, y el hijo va a mostrar sus nuevos PID, PPID e identificador de grupo de procesos. Pasados 10 segundos, el proceso hijo se va a convertir en el lder de un nuevo grupo de procesos y va a mostrar sus identificadores. #include <stdio.h> void main () { if ( fork ( ) == 0 ) { /* Cdigo del proceso hijo. */ printf ( "Soy el proceso hijo mi PID es %d, mi PPID es %d, y el ID de grupo es %d \n", getpid ( ), getppid ( ), getpgrp ( ) ); sleep ( 10 ); printf ( "Soy el proceso hijo y transcurrido 10 segundos, mi PID es %d, mi PPID es %d, y el ID de grupo es %d \n", getpid ( ), getppid ( ), getpgrp ( ) ); setpgrp ( ); printf ( Soy el proceso hijo y lder de un grupo de procesos. Ahora mi PID es %d, mi PPID es %d, y el ID de grupo es %d \n", getpid ( ), getppid ( ), getpgrp ( ) ); exit ( 0 ); } /* Cdigo que va a ejecutar el proceso padre. */ sleep ( 5 ); printf ( "Soy el proceso padre y transcurrido 5 segundos mi PID es %d, mi PPID es %d, y el ID de grupo es %d \n", getpid ( ), getppid ( ), getpgrp ( ) ); exit ( 0 ); } 2.3.2.- Identificadores de usuario y de grupo. Cada proceso tiene asociado un identificador de usuario UID y un identificador de grupo GID. El UID identifica al usuario que es responsable de la ejecucin del proceso y el GID al grupo al cual pertenece el usuario. Se pueden conocer los valores que toman estos identificadores mediante las llamadas getuid ( ) que devuelve el identificador de usuario y getgid ( ) que devuelve el identificador del grupo. Los procesos hijos heredan estos valores del proceso padre.

rea de Lenguajes y Sistemas Informticos (E.G.R.)

Pg. 4

You might also like