Marisa Gil PROCESOS UNIX Un ejemplo: 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 5 Marisa Gil 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() 6 Marisa Gil 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 7 Marisa Gil 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 8 Marisa Gil 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 9 Marisa Gil 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 10 Marisa Gil 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 11 Marisa Gil PROCESOS EN UNIX wait (&stat) 8 bits altos wait (&stat) 8 bits bajos TODO A CEROS exit (res) 8 bits altos wait (&stat) 8 bits bajos TODO A CEROS kill(nsignal,hijo) Introducció als Sistemes Operatius 12 Marisa Gil PROCESOS UNIX Signals Definición: mecanismo software para avisar a un proceso de la aparición de eventos (acontecimientos) asíncronos. • Similar a interrupciónes del hardware - rompen momentáneamente la secuencia del programa • Puede enviarlos el kernel u otros procesos Programa petición de servicio Llamadas al sistema aviso de evento signal (mecanismo de upcall) Sistema Operativo Introducció als Sistemes Operatius 13 Marisa Gil PROCESOS UNIX Programar el tratamiento de avisos asíncronos que lleguen al programa #include <signal.h> void (*signal(int sig, void (*function) (int))) (int); • Se pueden programar todos los signals, excepto SIGKILL y SIGSTOP • El parámetro function puede ser: • el tratamiento por defecto (SIG_DFL) • ignorarlo (SIG_IGN) • una función del propio programa ejecutable • Cada ejecución de un signal • en System V, hace que se desprograme (libsys5) • en BSD, mantiene la programación (libbsd o bsd_signal()) Como la función de tratamiento está incluída en el código, la llamada exec() provoca la desprogramación de los signals. Introducció als Sistemes Operatius 14 Marisa Gil PROCESOS UNIX Envío de avisos asíncronos entre procesos #include <signal.h> int kill(pid_t process,int signal ); process > 0: el signal especificado se envía al proceso con dicho id process = 0: el signal se envía a todos los procesos del grupo process=-1: el signal se envía a todos los procesos excepto los de sistema (superuser) process<-1: el signal se envía a todos los procesos con id de grupo igual en valor absoluto Introducció als Sistemes Operatius 15 Marisa Gil PROCESOS EN UNIX Etapas en la creación de procesos PREPARAR HERENCIA: el hijo quede conectado creación pipes programación signals pid = fork(); seguridad: es un pto seguro para el padre para el hijo switch(pid) { case -1: /* error */ case 0: /* código del hijo */ PREPARAR ENTORNO DE TRABAJO: redireccionar canales virtuales dejar listo lo que se tenga que encontrar el nuevo programa trabajo ejecutado por hijo exec..... algoritmo en el mismo cód. default: /* código del padre */ trabajo ejecutado por padre } Introducció als Sistemes Operatius 16 Marisa Gil UNIX SIGNALS Acciones por defecto • Hay cuatro posibles acciones por defecto que lleva a cabo el kernel cuando no especifica nada el proceso: - abort: genera un core dump y termina el proceso. - exit: termina el proceso sin generar core dump. - stop: suspende el proceso. - continue: si el proceso estaba suspendido, lo reanuda. • Para que cualquier acción se lleve a cabo, el proceso tiene que estar en ejecución. Introducció als Sistemes Operatius 17 Marisa Gil UNIX SIGNALS Tratamiento de los signals • Los signals asíncronos pueden llegar después de cualquier instrucción. • Si el signal llega en medio de una llamada al sistema: • Generalmente el sistema aborta la llamada y vuelve con error (EINTR) • 4.2BSD recomienza automáticamente algunas llamadas al sistema. Introducció als Sistemes Operatius 18 Marisa Gil UNIX SIGNALS A tener en cuenta ... • El comportamiento de los signals y el tratamiento interno del sistema puede variar entre versiones. • System V original define 15 signals, 4BSD y SVR4 definen 31. Algunos UNIX comerciales definen más. • El número correspondiente a cada signal también puede cambiar: por ejemplo, SIGSTOP es el 17 en 4.3BSD, y el 23 en SVR4. Introducció als Sistemes Operatius 19