3/12/15 Sistemas Operativos Llamadas al Sistema POSIX Servicios de gestión de procesos (POSIX) • • • • • • • Identificación de procesos Entorno de un proceso Creación de procesos Cambio del programa de un proceso Esperar la terminación de un proceso Finalizar la ejecución de un proceso Información sobre procesos ARCO 2015 2 Procesos 1 3/12/15 Servicios gestión de procesos (POSIX) pid_t fork(void) – Crea un proceso hijo. Devuelve 0 al proceso hijo y el pid del hijo al proceso padre. int execl(const char *path, const char *arg, ...) int execlp(const char *file, const char *arg, ...) int execvp(const char *file, char *const argv[]) – Permite a un proceso ejecutar un programa (código) distinto. Cambia la imagen de memoria del proceso.El pid no cambia. pid_t wait(int *status) – Permite a un proceso padre esperar hasta que termine un proceso hijo. Devuelve el identificador del proceso hijo y el estado de terminación del mismo. void exit(int status) – Finaliza la ejecución de un proceso indicando el estado de terminación del mismo. pid_t getpid(void) – Devuelve el identificador del proceso. pid_t getppid(void) – Devuelve el identificador del proceso padre. ARCO 2015 3 Procesos Servicios POSIX: fork • El fork crea un proceso clonando al padre Mapa de m em oria Im agen del proceso A Tabla de procesos BCP A El proc eso A hac e un fork y crea el proceso hijo B Mapa de m em oria Im agen del proceso A Im agen del proceso B ARCO 2015 Tabla de procesos BCP A BCP B 4 Nuevo PID Nueva descripción de m em oria Distinto valor de retorno (0 en el hijo) Procesos 2 3/12/15 fork. Crea un proceso • Servicio: #include <sys/types.h> pid_t fork(void); • Devuelve: – El identificador de proceso hijo al proceso padre y 0 al hijo – -1 el caso de error • Descripción : – Crea un proceso hijo que ejecuta el mismo programa que el padre – Hereda los ficheros abiertos (se copian los descriptores). – Las alarmas pendientes se desactivan. ARCO 2015 5 Procesos Servicios POSIX: exec • El exec cambia el programa de un proceso Mapa de m em oria Im agen del proceso Tabla de procesos El proc eso hac e un exec BCP Mapa de m em oria Tabla de procesos BCP Se borra la im agen de m em oria Se borra la desc ripc ión de la m em oria y registros Se c onserva el PID Objeto ejec utable Bibliotec a sistem a ARCO 2015 Cargad or Mapa de m em oria Im agen del proceso Tabla de procesos BCP 6 Se c arga la nueva im agen Se pone PC en direc c ión de arranque Se c onservan los fd Procesos 3 3/12/15 exec. Cambio del programa de un proceso • Servicios: int execl(const char *path, const char *arg, ...) int excelp(const char *file, const char *arg, ...) int execvp(const char *file, char *const argv[]) • Argumentos: – path, file: nombre del archivo ejecutable – arg: argumentos • Descripción: – – – – – Devuelve -1 en caso de error, en caso contrario no retorna. Cambia la imagen de memoria del proceso. El mismo proceso ejecuta otro programa. Los ficheros abiertos permanecen abiertos Las señales con la acción por defecto seguirán por defecto, las señales con manejador tomarán la acción por defecto. ARCO 2015 7 Procesos exit. Terminación de un proceso • Servicios: int exit(int status); • Argumentos: – Código de retorno al proceso padre • Descripción: – Finaliza la ejecución del proceso. – Se cierran todos los descriptores de ficheros abiertos. – Se liberan todos los recursos del proceso ARCO 2015 8 Procesos 4 3/12/15 wait. Espera la terminación de un proceso hijo • Servicios: #include <sys/types.h> pid_t wait(int *status); • Argumentos: – Devuelve el código de terminación del proceso hijo. • Descripción: – Devuelve el identificador del proceso hijo o -1 en caso de error. – Permite a un proceso padre esperar hasta que termine un proceso hijo. Devuelve el identificador del proceso hijo y el estado de terminación del mismo. ARCO 2015 9 Procesos Uso normal de los servicios pid P padre pid P padre fork() pid H hijo pid P pid P pid H exec() pid P wait() pid H hijo exit() pid H pid H hijo pid P padre zombie pid P texto datos pila Ficheros, tuberías, ... ARCO 2015 10 Procesos 5 3/12/15 Evolución de procesos • El padre muere: INIT acepta los hijos Init Init Init Proceso A fork() Proceso A Proceso A exit() Proceso B Proceso B ARCO 2015 Init wait() Init wait() Proceso B Proceso B exit() 11 Procesos Evolución de procesos II • Zombie: el hijo muere y el padre no hace wait Init Init Init Init Init Proceso A fork() Proceso A Proceso A Proceso A Proceso A wait() Proceso B Proceso B exit() Proceso B zombie Proceso B zombie ARCO 2015 12 Procesos 6 3/12/15 Programa de ejemplo I #include <sys/types.h> #include <stdio.h> /* programa que ejecuta el mandato ls -l */ main() { pid_t pid; int status; pid = fork(); if (pid == 0) { /* proceso hijo */ execlp("ls","ls","-l",NULL); exit(-1); } else /* proceso padre */ while (pid != wait(&status)); exit(0); } ARCO 2015 13 Procesos Programa de ejemplo II #include <sys/types.h> #include <stdio.h> main(void) { /* programa que ejecuta el mandato ls -l */ pid_t pid; int status; char *argumentos[3]; /* crea los argumentos */ argumentos[0] = "ls"; argumentos[1] = "-l"; argumentos[2] = NULL; pid = fork(); if (pid == 0) {/* proceso hijo */ execvp(argumentos[0], argumentos); exit(-1); } else /* proceso padre */ while (pid != wait(&status)) continue; exit(0); } 2015 ARCO 14 Procesos 7