FIB Tardor 02 PROCESOS UNIX Gestión de procesos en UNIX • Cada proceso sólo puede tener un flujo: el concepto “proceso” engloba todo • Dos llamadas implicadas en la creación de procesos • crear proceso • cargar programa • La relación de procesos es jerárquica: hijos, padres, abuelos... • El mecanismo de signals permite que el proceso sea avisado de acontecimientos • A través del sistema de ficheros, los procesos pueden pasarse datos Introducció als Sistemes Operatius Marisa Gil 1 FIB Tardor 02 PROCESOS UNIX Creación de procesos #include <sys/types.h> #include <unistd.h> pid_t fork(void); MEMORIA IPC PCB fork(); sentencia a; sentencia b; ......... MEMORIA PCB id:098 IPC xxxx yyyyy fork(); sentencia a; sentencia b; ......... id:098 PCB xxxx yyyyy id:103 IPC fork(); sentencia a; sentencia b; ......... xxxx yyyyy Antes del fork() Introducció als Sistemes Operatius Después del fork() Marisa Gil 2 FIB Tardor 02 PROCESOS UNIX Cambio de imagen del proceso que se está ejecutando #include <unistd.h> int execl(const char *path,const char *arg0,...,const char *argn, char * /*NULL*/); int execv(const char *path, char *const argv[]); int execle(const char *path,char *const arg0[],...,const char *argn, char * /*NULL*/,char *const envp[]); int execve(const char *path, char *const argv[],char *const envp[]); int execlp(const char *file,const char *arg0,...,const char *argn, char * /*NULL*/); Introducció als Sistemes Operatius Marisa Gil 3 FIB Tardor 02 PROCESOS UNIX Sincronización padre-hijo #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc); #include <stdlib.h> void exit(int status); #include <unistd.h> void _exit(int status); Introducció als Sistemes Operatius Marisa Gil 4 FIB Tardor 02 PROCESOS EN UNIX Extraído de Amir Afzal: “Introducción a UNIX. Un enfoque práctico”. Prentice Hall PCB de proceso del sistema crear un nuevo proceso (hijo) añadir proceso hijo a la tabla de procesos call fork almacenar la dirección de retorno del padre en el PCB del padre fork enviar el código 0 al proceso hijo devolver el ID del proceso hijo al padre devolver control al proceso padre padre Introducció als Sistemes Operatius LLAMADA fork() Marisa Gil hijo 5 FIB Tardor 02 PROCESOS EN UNIX PCB de proceso del sistema cambiar el estado del proceso padre a esperar (bloqueado) fork fork dar el control al proceso hijo call wait el padre va a estar bloqueado hasta que el hijo finalice padre Introducció als Sistemes Operatius LLAMADA wait() Marisa Gil hijo 6 FIB Tardor 02 PROCESOS EN UNIX cambiar el estado del proceso hijo a ejecutando PCB de proceso del sistema fork fork carga el nuevo programa ejecutable en memoria call exec comienza la ejecución del nuevo programa padre Introducció als Sistemes Operatius LLAMADA exec() Marisa Gil nuevo programa hijo 7 FIB Tardor 02 PROCESOS EN UNIX PCB de proceso del sistema cambia el estado del padre a preparado PCB de proceso del sistema pasar al padre el valor del hijo fork fork wait avisar al padre de que el hijo ha muerto (signal) el padre se despierta el padre continua su programa call exit padre Introducció als Sistemes Operatius LLAMADA exit() Marisa Gil hijo 8 FIB Tardor 02 PROCESOS EN UNIX Esquemas de creación de procesos pid = fork(); switch(pid) { case 0: /* código del hijo */ seguir código exit(resultado)/ break; execlp(“proghijo”, hijo,0); case -1: /* error */ default: /* código del padre */ seguir código wait(&resultado)/ break; execlp(“progpadre”, padre,0); } Introducció als Sistemes Operatius Marisa Gil 9 FIB Tardor 02 EJEMPLOS #include "error.h" main() { int contador=0,r, status; char c,s[100]; switch (fork()) { case -1: error("fork",SISTEMA); case 0: while ((r=read(0, &c,sizeof(char)))>0) if (c==’a’) contador++; if (r<0) error("read",SISTEMA); sprintf(s,"Soy %d: contador=%d\n",getpid(),contador); exit(0); default: /* codigo del padre */ wait(&status); } } Introducció als Sistemes Operatius Marisa Gil 10 FIB Tardor 02 PROCESOS EN UNIX Comunicación padre hijo en la finalización • La información que se pasan a través de las llamadas wait() y exit() es un acuerdo entre el padre y el hijo: • Totalmente arbitrario • transparente al sistema operativo y a las librerías • Por convenio e inteligibilidad de los programas, en las utilidades y programas de uso general se establece que: • Devolver un 0 es una finalización correcta • Devolver un valor diferente de 0 es una finalización errónea Introducció als Sistemes Operatius Marisa Gil 11 FIB Tardor 02 PROCESOS EN UNIX wait (&stat) 8 bits altos 8 bits bajos wait (&stat) TODO A CEROS exit (res) 8 bits altos wait (&stat) 8 bits bajos TODO A CEROS número de excepción Introducció als Sistemes Operatius Marisa Gil 12