Departamento de Informática Taller de Sistemas Operativos Universidad Técnica Federico Santa María Relaciones entre Procesos Grupos de procesos, sesiones, terminales de control 1 Departamento de Informática Taller de Sistemas Operativos Universidad Técnica Federico Santa María Login de Terminal en BSD Driver Driver Terminal Terminal init init pid == 1 init init exec getty exec login login exec getty fork Abre dispositivo y lee nombre de usuario + variables de ambiente básicos Lee /etc/ttys Valida usuario, define home, cambia permisos, define group IDs, más variables de ambiente y uid Raúl Monge shell shell Llama a script de partida (e.g. .cshrc y .login en csh) V-2 Departamento de Informática Taller de Sistemas Operativos Universidad Técnica Federico Santa María Login de Red en BSD Solicitud de Conexión TCP pid == 1 init init Lee /etc/rc Raúl Monge fork/ exec fork/ exec Pseudo Pseudo Terminal Terminal telnetd exec login login exec shell shell telnetd inetd inetd Abre dispositivo Valida usuario, y lee nombre de define home, usuario cambia permisos, + define group IDs, variables de más variables de ambiente básicos ambiente y uid Llama a script de partida (e.g. .cshrc y .login en csh) V-3 1 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos Grupos de Procesos • Cada proceso tiene un pid (process ID) y un pgid (process group ID) • Un grupo posee uno o más proceso • Cada grupo tiene un ID único en el sistema • El líder de grupo es aquel proceso donde pid == pgid. • El concepto de grupo de procesos es independiente de grupo de usuarios!! Raúl Monge V-4 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos Función: getpgrp #include <sys/types.h> #include <unistd.h> pid_t getpgrp(void); return: process group ID del proceso que llama • Permite obtener el ID del grupo de procesos (pgid) al que pertenece el que llama. • El líder puede crear un grupo de procesos y procesos en ese grupo y después terminar • Grupo de procesos existe mientras existan miembros Raúl Monge V-5 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos Función: setpgid #include <sys/types.h> #include <unistd.h> int setpgid(pid_t pid, pid_t pgid); return: 0 si OK, -1 si existe error • Permite unirse a un grupo existente o crear un nuevo grupo • Si pid == pgid, proceso pid se convierte en líder de grupo • Un proceso sólo puede cambiar su propio grupo o el de sus hijos (siempre que éstos no hayan llamado a exec). – Si pid == 0, se usa pid de proceso que llama – Si pgid == 0, se usa para el grupo pid de argumento • Retorna error si no existe soporte para control de trabajos. Raúl Monge V-6 2 Departamento de Informática Taller de Sistemas Operativos Universidad Técnica Federico Santa María Sesiones • Una sesión es un conjunto de uno o más grupos de procesos. • Generalmente una shell agrupa procesos de un comando en un grupo. • Ejemplo: proc1 | proc2 & proc3 | proc4 | proc5 shell proc1 grupo1 proc2 grupo2 proc3 proc4 proc5 grupo3 sesión Raúl Monge V-7 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos Función: setsid #include <sys/types.h> #include <unistd.h> pid_t setsid(void); return: process group ID si OK, -1 si exisste error • Permite crear una sesión (session ID) si el proceso que llama no es líder de grupo (sino es error). • Con el procesdo que llama sucede lo siguiente: – El proceso se convierte en líder de sesión siendo inicialmente el único proceso de la sesión. – Se convierte en líder de grupo con pgid igual a su pid – El proceso no tiene terminal de control (si lo tenía antes de setsid, esta asociación se rompe con la llamada) Raúl Monge V-8 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos Terminal de Control • Una sesión puede tener un único terminal de control, que normalmente corresponde al terminal (o pseudo) de login. • El líder de sesión que estableció la conexión al terminal de control es el proceso de control . • Los grupos de procesos de una sesión se clasifican en: – Un único grupo de procesos frontales (foreground) – Cero o más grupos de procesos traseros (background) • Tecla de interrupción (e.g. CTL-C) o de renuncia (e.g. CTL-\) causa envío de señal SIGINT o SIGQUIT al grupo de procesos frontales. • Si se desconecta un modem, se envía señal SIGHUP (hang-up) a proceso de control. Raúl Monge V-9 3 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos E/S Forzada de Procesos con Terminal de Control • Existen situaciones donde los procesos pueden haber redireccionado sus E/S, pero desean realizar una E o S con terminal de control • Se asegura abriendo archivo /dev/tty • Un ejemplo típico es crypt (para cifrado o descifrado de texto usando una clave) Raúl Monge V-10 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos Funciones: tcgetpgrp y tcsetpgrp #include <sys/types.h> #include <unistd.h> pid_t tcgetpgrp(int fildes); return: process group ID grupo de procesos frontales si OK, -1 si existe error pid_t tcsetpgrp(int fildes, pid_t pgrpid); return: 0 si OK, -1 si existe error • Permiten ver cual es o modificar el grupo de procesos frontales del terminal abierto en filedes. • En una sesión se puede cambiar el grupo de procesos frontales usando pgrpid adecuado. • Estas funciones normalmente son usadas por la shell con soporte para control de trabajos. Raúl Monge V-11 Departamento de Informática Universidad Técnica Federico Santa María Taller de Sistemas Operativos Generación Típica de Señales • Drivers de terminales a procesos frontales: – SIGINT: caracter de interrupción (e.g. DEL o CTL-C) – SIGQUIT: caracter de renuncia (e.g. CTL-\) – SIGSTP: carácter de suspensión (e.g. CTL-Z) • De la shell a procesos frontales: – SIGCONT: para que continúen procesos frontales que habían sido suspendidos. Raúl Monge V-12 4