Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pgina: 1
SESIN 05:
Programacin de Procesos en C
para Linux
I
OBJETIVOS
II
TEMAS A TRATAR
Identificadores (PID, PPID, UID, EUID, GID y EGID)
Llamadas al sistema
Cmo crear un proceso
La llamadas al sistema fork()
La llamadas al sistema exec()
Finalizacin de procesos
La llamada al sistema exit, wait y waitpid
Obtencin de Identificadores (getpid(), getppid())
GCC (Compilacin)
./ (Ejecucin)
III
MARCO TEORICO
Identificadores PID, PPID, UID, EUID, GID y EGID
Process ID (PID)
Sesin 05
Pgina: 2
Sesin 05
Pgina: 3
En la mayora de los versiones actuales de Unix el proceso puede estar en varios grupos y
se chequea contra toda la lista de grupos para definir si el proceso puede acceder o no a
un recurso.
Sesin 05
Pgina: 4
La forma en que un proceso arranca a otro es mediante una llamada al sistema con la
funcin fork(). Lo normal es que el proceso hijo ejecute luego una llamada al sistema
exec(). fork() duplica un proceso generando dos procesos casi idnticos. En realidad solo
se diferenciaran en los valores PID y PPID. Un proceso puede pasar al proceso hijo una
serie de variables pero un hijo no puede pasar nada a su padre a travs de variables.
Adems fork() retorna un valor numrico que ser -1 en caso de fallo, pero si tiene xito
se habr producido la duplicacin de procesos y retornar un valor distinto para el
proceso hijo que para el proceso padre. Al proceso hijo le retornar el valor 0 y al
proceso padre le retornar el PID del proceso hijo. Despus de hacer fork() se pueden
hacer varias cosas pero lo primero que se utiliza despus del fork es una pregunta sobre
el valor retornado por fork() para as saber si ese proceso es el padre o el hijo ya que cada
uno de ellos normalmente deber hacer cosas distintas.
int PID = fork()
crea un nuevo proceso (hijo del que hace la llamada a fork). padre e hijo continan la
ejecucin en la instruccin inmediatamente posterior al fork.
Con:
PID = 0 en el hijo,
PID > 0 en el padre (y contiene el pid del hijo)
PID < 0 si error
El sistema operativo UNIX ofrece una llamada al sistema llamada exec para lanzar a
ejecucin un programa, almacenado en forma de fichero. Aunque en el fondo slo existe
una llamada, las bibliotecas estndares del C disponen de varias funciones, todas
comenzando por exec que se diferencian en la manera en que se pasan parmetros al
programa.
La versin tpica cuando se conoce a priori el nmero de argumentos que se van a
entregar al programa se denomina execl. Su sintaxis es
Sesin 05
Pgina: 5
Escribiramos
execl ( "/bin/ls", "ls", "-l", "/usr/include", 0 );
Observe que el primer argumento coincide con el nombre del programa. En caso de
desconocer con anticipacin el nmero de argumentos, habr que emplear la funcin
execv, que tiene este prototipo:
execv ( char* fichero, char* argv [] );
El parmetro argv es una tira de cadenas que representan los argumentos del programa
lanzado, siendo la ltima cadena un nulo (o cero). El ejemplo anterior se resolvera as:
char* parametros [] = { "ls", "-l", "/usr/include", 0 }; ...
execv ( "/bin/ls", parametros );
En los anteriores ejemplos se ha escrito el nombre completo del fichero para ejecutar
("/bin/ls" en vez de "ls"). Esto es porque tanto execl como execv ignoran la variable
PATH, que contiene las rutas de bsqueda. Para tener en cuenta esta variable pueden
usarse las versiones execlp o execvp. Por ejemplo:
execvp ( "ls", parametros );
Finalizacin de procesos
exit
void exit (int status)
exit finaliza al proceso que lo llam, con un cdigo de estado igual al byte inferior del
parmetro status. Todos los descriptores de archivo abiertos son cerrados y sus buffers
sincronizados, si hay procesos hijo cuando el padre ejecutar un exit, el PPID de los hijos
se cambia a 1 (proceso init). Es la nica llamada al sistema que nunca retorna.
Sesin 05
Pgina: 6
El valor del parmetro status se utiliza para comunicar al proceso padre la forma en que
el proceso hijo termina. Por convenio, este valor suele ser 0 si el proceso termina
correctamente y cualquier otro valor en caso de terminacin anormal. El proceso padre
puede obtener este valor a travs de la llamada al sistema wait.
wait y waitpid
Espera a que pare o termine un proceso hijo, permitiendo obtener sus estados de salida.
Una seal no bloqueada o no ignorada puede reactivar el proceso padre.
pid_t wait (int *statusp)
Si hay varios procesos hijos, wait espera hasta que uno de ellos termina. No es posible
especificar por qu hijo se espera. wait retorna el PID del hijo que termina (o -1 si no se
crearon hijos o si ya no hay hijos por los que esperar) y almacena el cdigo del estado de
finalizacin del proceso hijo (parmetro status en su llamada al sistema exit) en la
direccin apuntada por el parmetro statusp.
Un proceso puede terminar en n momento en el que su padre no le est esperando. Como
el kernel debe asegurar que el padre pueda esperar por cada proceso, los procesos hijos
por los que el padre no espera, se convierten en procesos zombies (se descartan sus
segmentos, pero siguen ocupando una entrada en la tabla de procesos del kernel). Cuando
el padre realiza una llamada wait, el proceso hijo es eliminado de la tabla de procesos.
No es obligatorio que todo proceso padre espera a sus hijos.
Un proceso puede termina por:
Causa de terminacin
Llamada al sistema exit
Recibe una seal
Cada del sistema
(p.e.: prdida de la alimentacin del equipo)
Contenido de *statusp
Byte ms a la derecha = 0
Byte de la izquierda = parmetro status de exit
En los 7 bits de ms a la derecha se almacena el nmero
de seal que termin con el proceso. Si el 8vo bit ms a la
derecha est en 1, el proceso fue detenido por el kernel y
se gener un volcado del proceso en un archivo core.
Todos los procesos desaparecen bruscamente. No hay
nada que devolver
Proceso zombie:
Proceso parado que queda en la tabla de procesos hasta que termine su padre. Este hecho
se produce cuando el proceso padre no recoge el cdigo de salida del proceso hijo.
Proceso hurfano:
Proceso en ejecucin cuyo padre ha finalizado. El nuevo identificador de proceso padre
(PPID) coincide con el identificador del proceso init (1).
Sesin 05
Pgina: 7
GCC
Cada vez que usted desea compilar un programa con extensin .c (dentro de las
principales) lo puede hacer con el comando gcc por ejemplo:
gcc programas.c o programas.exe
./
Con esta instruccin usted puede ejecutar el programa cuyo ejecutable cre
anteriormente. Por ejemplo:
./ programas.exe
Por ahora solo necesitamos saber esa informacin para empezar a crear nuestros
programas y ejecutarlos en C.
IV
ACTIVIDADES
1. Realice los ejemplos que se encuentren en el Marco Terico
2. Para los siguientes ejercicios utilizaremos el lenguaje de programacin C y el
compilador gcc.
3. En cualquier editor digite el siguiente programa y evale el resultado
// Nos d el PPID y el PID
#include <unistd.h>
#include <stdio.h>
#include <stlib.h>
int main(void)
{
printf("Proseso hijo PID= %d\n", getpid());
printf("Proceso padre PPID= %d\n", getppid());
exit(0);
}
Sesin 05
Pgina: 8
de
de
de
de
Sesin 05
Pgina: 9
V
EJERCICIOS
Realice la escritura, compilacin y ejecucin de los siguientes programas
01. A los programas de los incisos 3 y 6 colocarles la llamada exec() donde crea
conveniente para finalizar correctamente los procesos.
M.Sc. Karim Guevara Puente de la Vega, Ing. Eveling Castro
Sesin 05
Pgina: 10
VI
BIBLIOGRAFIA Y REFERENCIAS
Blanco, V., Linux Instalacin, Administracin y uso del Sistema, Ed. Ra-Ma,
Mxico, 2001.
http://users.exa.unicen.edu.ar/~hcurti/linux/index.html
Sesin 05