Você está na página 1de 14

1

UNIVERSIDAD ANDINA DEL CUSCO

PROGRAMA ACADEMICO PROFESIONAL INGENIERIA DE SISTEMAS

ASIGNATURA: SISTEMAS OPERATIVOS

TEMA: Llamadas POSIX para Gestin de procesos

Alumno: Deza Castilla Ivanhof B.

CUSCO PERU 2012

y y y y

Un proceso consta de cdigo, datos y pila. 2 Los procesos existen en una jerarqua de rbol (varios Hijos, un slo padre). El sistema asigna un identificador de proceso (PID) nico al iniciar el proceso. El planificador de tareas asigna un tiempo compartido para el proceso segn su prioridad (slo root puede cambiar prioridades). LLAMADAS POSIX PARA GESTION DE PROCESOS OBJETIVOS DE UN SISTEMA OPERATIVO (SO)

y y y

Intercalar ejecucin de varios procesos para maximizar la utilizacin del CPU y proveer tiempo de respuesta razonable. Asignar recursos a procesos. Soportar comunicacin entre procesos (IPC) y creacin de procesos por parte de los usuarios.

OBLIGACIONES DEL SISTEMA OPERATIVO COMO GESTOR DE PROCESOS y y y Creacin y eliminacin de procesos. Planificacin de procesos (procurando la ejecucin de mltiples procesos maximizando la utilizacin del procesador). Establecimiento de mecanismos para la sincronizacin y comunicacin de procesos.

PROCESOS y y y y Las tareas y programas se ejecutan en un contexto llamado proceso. Contexto: memoria, tablas en el kernel (archivos abiertos, sockets, PCB). Los procesos tienen un identificador PID. Procesos se alternan en el uso del CPU.

Un sistema consiste en una coleccin de procesos que podran ejecutarse concurrenteme nte.

Ejecucin en 1er plano: Proceso iniciado por el usuario o interactivo. Ejecucin en 2o plano: Proceso no interactivo que no necesita ser iniciado por el usuario. Demonio: Proceso en 2o plano siempre disponible, que da servicio a varias tareas (debe ser propiedad del usuario root). Proceso zombi: 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).

Ejecucin de comandos. Subrutina system: - Descripcin: Llamada a un intrprete para ejecutar un comando. El proceso espera a que finalice la ejecucin de la subrutina y devuelve la salida del programa ejecutado. - Formato: y y y - Parmetro: Cadena - Comando a ejecutar. - Devuelve: Estado de salida del programa ejecutado. -1 o 127 en caso de error. - Observaciones: a) Se crea un proceso hijo (fork) y se lanza (exec) /usr/bin/bsh, que interpreta el comando a ejecutar. b) Si la llamada se hace con camino seguro, la orden exec ejecuta el intrprete /usr/bin/tsh. c) Se ignoran las seales SIGINT y SIGQUIT y se bloquea la seal SIGCHLD. d) La salida de system no afecta a la salida de los procesos hijos del proceso ejecutor. Subrutinas exec>: - Descripcin: y y - Formatos: y y y y y #include <unistd.h> int execl (camino, arg0 [, arg1, ...] , 0) const char *camino, *arg0, *arg1, ...; int execle (camino, arg0 [, arg1, ...] , 0, p_entorno) const char *camino, *arg0, *arg1, ...; Ejecuta un nuevo programa en el mismo proceso. Se crea un proceso imagen sustituyendo el programa actual por el nuevo. #include <stdlib.h> int system (cadena) const char *cadena;

4
y y y y y y y y y y y y y y - Sufijos: y y y y y L - usa lista de parmetros, el ltimo debe ser 0. V - usa matriz de parmetros generada previamente, el ltimo debe ser 0. T - trazado del programa con ptrace (en desuso). E - usa la matriz de variables de entorno. P - bsqueda utilizando la variable PATH. char *const p_entorno[]; int execlp (fichero, arg0 [, arg1, ...] , 0) const char *fichero, *arg0, *arg1, ...; int execv (camino, val_args) const char *camino; char *const val_args[]; int execve (camino, val_arg, p_entorno) const char *camino; char *const val_args[], *p_entorno[]; int execvp (fichero, val_args) const char *fichero; char *const val_args[]; int exect (camino, val_arg, p_entorno) char *camino, *val_args, *p_entorno[];

- Parmetros: y y y y y Camino - Camino completo del fichero ejecutable. Fichero - Nombre del fichero ejecutable. argN - Argumento N-simo. val_args - Puntero a la matriz de argumentos. p_entorno - Puntero a la matriz del entorno.

- Devuelve: -1, en caso de error. - Comentarios: a) La rutina principal (main) de un programa C ejecutable recibe los siguientes parmetros: y y y y int main (cont_args, val_args, p_entorno) int cont_args; /* Contador de argumentos. */ char *val_args; /* Puntero a la matriz de argumentos. */ char *p_entorno; /* Puntero a la matriz del entorno. */ Las variables val_args y p_entorno so n similares a las utilizadas en las subrutinas exec. b) Esta rutina principal llama a una subrutina de iniciacin que construye la variable de entrono. Dicha variable global es accesible desde el programa declarndola de la siguiente manera:

5
extern char **environ; Las subrutinas exec que no usan el parmetro p_entorno utilizan la variable environ. c) Los descriptores de ficheros abiertos se pasan al nuevo proceso imagen, excepto los que tengan activo el bit FD_CLOEXEC (ver fcntl). d) Las seales capturadas se reasignan a sus acciones por defecto; las ignoradas, continan siendo ignoradas (ver sigaction). e) Si el nuevo proceso imagen tiene activo el bit SUID, la identificacin efectiva de usuario (EUID) del nuevo proceso toma el valor del identificador del propietario. Idem, si tiene activo el bit SGID. f) Los identificadores reales de usuario y de grupo (RUID y RGID) mantienen el valor que tenan en el proceso llamador. g) El prrafo anterior puede aplicarse a ficheros remotos (previa traduccin de los identificadores). h) El prrafo e) no afecta a las shell-scripts. i) El proceso nuevo mantiene las siguientes caractersticas del proceso llamador: y y y y y y Identificadores de proceso (PID), de proceso padre (PPID) y de grupo de procesos (PGID). Valores de prioridad (nice), de TTY y del bit de trazado. Directorio actual y directorio raz. Mscara de ficheros, limites de longitud de ficheros, lmites de recursos. Tiempos para activar alarmas y subrutinas times. Identificador de usuario de conexin. CREACION DE PROCESOS Subrutina fork: Descripcin: y Crea un nuevo proceso (hijo), copia casi exacta del proceso generador (padre).

Formato: y y #include <unistd.h> pid_t fork ();

Devuelve: y 0 al proceso hijo y PID del hijo al proceso padre (-1, si error).

Obervaciones: a) La versin BSD (en la librera libbsd.a) es: int vfork (); b) Atributos que hereda el proceso hijo. y y y y y y y y y Entorno. Bit FD_CLOEXEC para cada descriptor de fichero. Seales capturadas. SUID y SGID. Estado de privilegios y prioridades. Libreras compartidas y segmentos de memoria compartida. PGID y TTYGID. Directorio actual y directorio raz. Mscara y lmites de medida para ficheros.

6
y y Eventos y estado de auditora. Estado de depuracin.

c) Atributos diferenciadores entre padre e hijo: y y y PID nico. PPID distintos (el PPID del hijo coincide con el PID del padre). El proceso hijo tiene su propia copia de los descriptores de fichero del padre, pero comparte con ste un puntero a fichero para cada descriptor del proceso padre. Bloqueos de proceso, texto y datos no se heredan. Las subrutinas times se ponen a 0. Las alarmas pendientes toman su valor inicial. Se eliminan las seales pendientes para el proceso hijo.

y y y y

Subrutinas wait y waitpid: Descripcin: y y 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.

Formato: #include <sys/wait.h> pid_t wait (estados) int *estados; pid_t wait ((void *) 0); pid_t waitpid (PID, estados, opciones) pid_t PID; int *estados, opciones; Parmetros:< PID - PID del proceso o grupo de proceso. Sus valores son: y y y y -1: waitpid acta igual que wait, esperando cualquier hijo. >0: PID de un proceso hijo determinado. 0: para cualquier hijo con el mismo grupo de procesos que el padre. <-1: para cualquier hijo cuyo grupo de proceso sea igaul al valor absoluto de PID.

opciones - Mscara de opciones. Sus bits son: y y WNOHANG: evita la suspensin del padre mientras est esperando a algn hijo. WUNTRACED: el padre obtiene informacin adicional si el hijo recibe alguna de las seales SIGTTIN, SIGTTOU, SIGSSTP o SIGTSTOP .

estados - Puntero a una tabla con los estados de salida de los procesos. Devuelve: 0, si no ha terminado ningn proceso.

7
Macros: WIFSTOPPED (estado) /* !=0, si estado es de un hijo parado */ pid_t estado; int WSTOPSIG (estado) /* N de seal que ha causado la parada */ pid_t estado; WIFEXITED (estado) /* !=0, si estado es de salida normal */ pid_t estado; int WEXITSTATUS (estado) /* 8 bits bajos del estado de salida */ pid_t estado; WIFSIGNALED (estado) /* !=0, si estado es de salida anormal */ pid_t estado; int WTERMSIG (estado) /* N de saal que ha causado la slida */ pid_t estado; Observaciones: a) Estas subrutinas pueden verse afectadas por la seal SIGCHLD (ver sigaction). b) La subrutina wait espera la terminacin de cualquier proceso hijo. TERMINACIN DE UN PROCESO. Subrutina exit: Descripcin: y Termina la ejecucin de un proceso.

Formato: y y y #include <stdlib.h> void exit (estado) int estado;

Parmetro: y Estado de salida del proceso.

Comentarios: a) El proceso de salida de un proceso es el siguiente: y y y Llamada a la funcin _cleanup para limpiar las reas de E/S. Llamada a la subrutina especificada en la subrutina atexit. Llamada a la subrutina _exit para finalizar el proceso.

8
b) Si _cleanup no puede cancelar las peticiones de E/S asncrona, la aplicacin se bloquea hasta que se completen dichas peticiones. c) Se cierran todos los descriptores de fichero. d) Si el proceso padre est en espera (ver wait), se devuelve el valor de los 8 bits menos significativos del estado de salida. e) Se enva una seal SIGCHLD al proceso padre. La accin por defecto es ignorar esta seal. Si no se ignora, el proceso hijo puede quedar como proceso zombi. f) La salida de un proceso no provoca la terminacin de sus hijos. El PPID de los hijos ser el PPID del proceso init (1). g) Se eliminan los bloqueos de ficheros (ver fcntl). h) Si para un proceso perteneciente a un grupo hurfano, se envan las seales SIGHUP y SIGCONT a cada proceso del grupo de procesos hurfanos. Subrutina atexit: Descripcin: y Ejecuta una determinada funcin antes de la terminacin del proceso.

Formato: y y y #include <sys/limits.h> int atexit (funcin) void (*funcin) (void);

Parmetro: y Puntero a la funcin llamada.

Devuelve: y 0: si no hay errores.

Comentarios: a) La funcin se ejecuta si se ha completado con xito la subrutina _cleanup.

SEALES. Conceptos generales. Seal: Evento que debe ser procesado y que puede interrumpir el flujo normal de un programa. Capturar una seal: Una seal puede asociarse con una funcin que procesa el evento que ha ocurrido. Ignorar una seal:

9
El evento no interrumpe el flujo del programa. Las seales SIGINT y SIGSTOP no pueden ser ignoradas (ver tabla de seales). Accin por defecto: Proceso suministrado por el sistema para capturar la seal (ver tabla de seales). Alarma: Seal que es activada por los temporizadores del sistema. Error: Fallo o accin equivocada que puede provocar la terminacin del proceso. Error crtico: Error que provoca la salida inmediata del programa. Lista de las seales ms importantes. Nm. Nombre 1 SIGHUP 2 SIGINT 3 SIGQUIT1 4 SIGILL1 5 SIGTRAP1 6 SIGABRT1 8 SIGFPE1 9 SIGKILL1 10 SIGBUS1 11 SIGSEGV1 12 SIGSYS1 13 SIGPIPE 14 SIGALRM 15 SIGTERM 16 SIGURG2 17 SIGSTOP3 18 SIGTSTP3 19 SIGCONT4 20 SIGCHLD2 21 SIGTTIN3 22 SIGTTOU3 23 SIGIO2 24 SIGXCPU 25 SIGXFSZ 30 SIGUSR1 31 SIGUSR2 Comentarios Colgar. Generada al desconectar el terminar. Interrupcin. Generada por teclado. Salir. Generada por teclado. Instruccin ilegal. No se puede recapturar. Trazado. No se puede recapturar. Abortar proceso. Excepcin aritmtica, de coma flotante o divisin por cero. Matar proceso. No puede capturarse, ni ignorarse. Error en el bus. Violacin de segmentacin. Argumento errneo en llamada al sistema. Escritura en una tubera que otro proceso no lee. Alarma de reloj. Terminacin del programa. Urgencia en canal de E/S. Parada de proceso. No puede capturarse, ni ignorarse. Parada interactiva. Generada por teclado. Continuacin. Generada por teclado. Parada o salida de proceso hijo. Un proceso en 2o plano intenta leer del terminal. Un proceso en 2o plano intenta escribir en el terminal. Operacin de E/S posible o completada. Tiempo de UCP excedido. Excedido el lmite de tamao de fichero. Definida por el usuario nmero 1. Definida por el usuario nmero 2.

34 SIGVTALRM Alarma de tiempo virtual. 36 SIGPRE Excepcin programada. Definida por el usuario.

10
Notas sobre la accin por defecto para la seal. 1. 2. 3. 4. Generar un fichero core. Ignorar la seal. Parar el proceso que recibe la seal. Reiniciar o continuar el proceso que recibe la seal.

Las seales comprendidas entre la 37 y la 58 (ambas inclusive) estn reservadas por el sistema. El rango de seales en el UNIX de Berkeley (BSD) es de 1 a 31. Capturar seales. Subrutina signal: Descripcin: y Asocia una accin determinada con una seal.

Formato: y y y y #include <signal.h> void (*signal (seal, accin)) () int seal; void (*accn) ();

Parmetros: y y Seal: Nmero de seal, excepto SIGKILL. Accin: Puntero a la rutina asociada con la seal o uno de los valores: y y Devuelve: Valor de la accin anteriormente asociada; -1, en caso de error. Observaciones: a) Existe una versin de la subrutina signal compatible con el UNIX de Berkeley (BSD). b) No se permiten mscaras de bloqueo de seales y se activa el bit SA_OLDSTYLE (ver >sigaction). SIG_DFL: accin por defecto para dicha seal. SIG_IGN: ignorar la seal,

Subrutina sigaction: Descripcin: Especifica la accin a realizar cuando un proceso recibe una seal. Formato:
#include <signal.h>

11
int sigaction (seal, accin, accin_salida) () int seal; struct sigaction *accn, *accin_salida;

Parmetros: seal: Nmero de seal, excepto SIGKILL. accin: Accin especificada cuando se recibe la seal. accin_salida: Accin a realizar cuando termine la funcin sigaction. Campos de la estructura sigaction:
void (*sa_handler) ();

Puntero a la rutina asociada con la seal o

uno de los valores:


y y

SIG_DFL: accin por defecto para dicha seal. SIG_IGN: ignorar la seal.

sigset_t sa_mask; Especifica int sa_flags; y

la mscara de las seales que sern bloqueadas durante la captura de la seal especificada.

SA_ONSTACK: La captura de la seal se realiza en una pila de seales en vez de en la pila del proceso. SA_OLDSTYLE: El parmetro seal se asocia con la acin por defecto (SIG_DFL) antes de llamar a la rutina de captura (no recomendable, la seal puede recurrir). SA_NOCLDSTOP: Evita que el proceso padre reciba una seal SIGCHLD cuando para el proceso hijo.

Devuelve: 0, si es correcta; -1, en caso de error. Comentarios: a) Las siguientes funciones pueden ser llamadas sin problemas desde una rutina de captura de seales:
_exit close fork access creat fstat alarm dup getegid chdir dup2 geteuid chmod exec getgid chown fcntl getgroups

12 getpgrp lseek readx sigaction sigpending tcflow tcsetpgrp ustat getpid mkdir rename sigaddset sigprocmask tcflush time utime getppid mkfifo rmdir sigdelset sigsuspend tcgetattr times write getuid open setgid sigfillset sleep tcgetpgrp umask kill pause setpgrp sigismember statx tcsendbreak uname link pipe setuid signal tcdrain tcsetattr unlink

b) Una vez que una accin est instalada para una seal, contina hasta que haya otra llamada a sigaction o se llame a la subrutina exec, excepto si se ha activado el bit SA_OLDSTYLE. c) Las seales SIGKILL y SIGSTOP no pueden ser ignoradas.
Subrutina kill: Descripcin: y Enva una seal a un proceso.

Formato: y y y y #include <signal.h> int kill (proceso, seal) pid_t proceso; int seal;

Parmetros: y Proceso: Identificador del proceso o del grupo de procesos que recibir la seal. Puede tomar los siguientes valores: y y

>0: Identificador de un nico proceso. 0: Procesos cuyo identificador del grupo de procesos sea igual al PID del proceso actual. y <-1: Procesos cuyo identificador del grupo de procesos sea igaul al valor absoluto de proceso. y Seal: Nmero de seal enviada. Devuelve: y 0, si se ha completado correctamente; -1, en caso de error.

Comentarios: a) La subrutina raise enva una seal al proceso actual. #include <sys/signal.h> int raise (seal) int seal;

13
Este cdigo es equivalente al mostrado a continuacin: error = kill (getpid (), seal); b) La subrutina killpg enva una seal a un grupo de procesos. Esta subrutina es compatible con el UNIX de Berkeley (librera libbsd.a). #include <signal.h> int killpg (int grupo_procesos, int seal); El cdigo anterior equivale al mostrado a continuacin: if (grupo_procesos < 0) { errno = ESRCH; return (-1); } return (kill(-grupo_procesos, seal)); c) Para enviar una seal a otro proceso deben coincidir el identificador de usuario (UID) real o efactivo de ambos procesos, o que el proceso emisor tenga prioridad de usuario root. Alarmas y temporizadores. Subrutinas alarm y ualarm: Descripcin: y Genera alarmas de reloj (seal SIGALRM) para el proceso actual.

Formato y y y y y Parmetros: y y y Devuelve: y y alarm devuelve el nmero de segundos que restan para generar la seal. ualarm devuelve el nmero de microsegundos que restan hasta la prxima seal. segundos: Nmero de segundos para enviar al proceso la seal SIGALRM. valor: Nmero de seales generadas. intervalo: Intervalo (en ms.) entre las seales. #include <unistd.h> unsigned int alarm (segundos) unsigned int segundos; unsigned int ualarm (valor, intervalo) unsigned int valor, intervalo;

Comentarios: a) Slo puede generarse una nica alarma (no son aplilables). b) El parmetro intervalo no puede ser menor que 10 para un usuario sin privilegios.

14
c) Estas 2 subrutinas son compatibles con las primeras versiones del AIX, con UNIX System V y con UNIX de Berkeley (BSD). En AIX, se han programado como llamadas a la subrutinaincinterval.

Você também pode gostar