12.10.2014 Views

TEMA 2. GESTIÓN DE PROCESOS - Universidad de Almería

TEMA 2. GESTIÓN DE PROCESOS - Universidad de Almería

TEMA 2. GESTIÓN DE PROCESOS - Universidad de Almería

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Diseño <strong>de</strong> Sistemas Operativos<br />

Tema <strong>2.</strong> Gestión <strong>de</strong> Procesos<br />

• Con respecto al i<strong>de</strong>ntificador <strong>de</strong> grupo efectivo (EGID), se aplica la misma norma, y el EGID es el<br />

GID <strong>de</strong>l grupo al cual pertenece el usuario indicado en el EUID. S_ISGID ⇒ otro <strong>de</strong> los bits <strong>de</strong> la<br />

palabra <strong>de</strong> modo <strong>de</strong> un archivo (cambia el GID <strong>de</strong>l grupo al ejecutar) y tiene un significado<br />

parecido al <strong>de</strong> S_ISUID, pero referido al grupo <strong>de</strong> usuarios al que pertenece el propietario <strong>de</strong>l<br />

archivo. Así, cuando ejecutamos un programa que tiene activo este bit, nuestro EGID (i<strong>de</strong>ntificador<br />

<strong>de</strong> grupo efectivo) toma el valor <strong>de</strong>l GID <strong>de</strong>l propietario <strong>de</strong>l programa.<br />

• Para <strong>de</strong>terminar qué valores toman estos i<strong>de</strong>ntificadores utilizamos:<br />

– La llamada getuid, que <strong>de</strong>vuelve el i<strong>de</strong>ntificador <strong>de</strong>l usuario real o UID.<br />

– La llamada geteuid, que <strong>de</strong>vuelve el i<strong>de</strong>ntificador <strong>de</strong>l usuario efectivo o EUID.<br />

– La llamada getgid, que <strong>de</strong>vuelve el i<strong>de</strong>ntificador <strong>de</strong>l grupo real o GID.<br />

– La llamada getegid, que <strong>de</strong>vuelve el i<strong>de</strong>ntificador <strong>de</strong>l grupo efectivo o EGID.<br />

• Tanto setuid como setgid van a tener un comportamiento u otro, <strong>de</strong>pendiendo si el valor que tiene<br />

el EUID <strong>de</strong>l proceso (i<strong>de</strong>ntificador <strong>de</strong> usuario efectivo) es el <strong>de</strong>l superusuario o no.<br />

– En el caso <strong>de</strong> setuid(uid):<br />

+ Si el EUID <strong>de</strong>l proceso (i<strong>de</strong>ntificador <strong>de</strong> usuario efectivo) es el <strong>de</strong>l superusuario, el<br />

kernel va a cambiar el UID y el EUID (en la tabla <strong>de</strong> procesos y en el u-Area) <strong>de</strong>l<br />

proceso para que tomen el valor <strong>de</strong>l parámetro uid.<br />

+ Si el EUID <strong>de</strong>l proceso (i<strong>de</strong>ntificador <strong>de</strong> usuario efectivo) no es el <strong>de</strong> superusuario,<br />

pero el valor <strong>de</strong>l parámetro uid coinci<strong>de</strong> con UID (i<strong>de</strong>ntificador <strong>de</strong> usuario real), EUID<br />

va a tomar el valor <strong>de</strong> uid. Esto se hace para restaurar el valor <strong>de</strong> EUID <strong>de</strong>spués <strong>de</strong><br />

que el proceso ejecute algún programa que tiene activo el bit S_ISUID. En estos casos,<br />

setuid <strong>de</strong>vuelve 0 para indicar que no se ha producido ningún error y en cualquier otro<br />

caso <strong>de</strong>volverá –1 y en errno estará el código <strong>de</strong>l error producido.<br />

– En el caso <strong>de</strong> setgid(gid), se aplica lo dicho en setuid, pero referido al GID y al EGID. En<br />

concreto, si el EUID <strong>de</strong>l proceso es el <strong>de</strong>l superusuario, entonces el GID y el EGID cambian<br />

para tomar el valor <strong>de</strong>l parámetro gid, y si no lo es, pero gid tiene el valor GID, entonces el<br />

EGID toma el valor <strong>de</strong> gid. En cualquier otro caso se producirá un error.<br />

• Programa login llama a setuid y setgid (ejemplo <strong>de</strong> aplicación <strong>de</strong> estas dos llamadas).<br />

– Este programa (login) se ejecuta con el EUID (i<strong>de</strong>ntificador <strong>de</strong> usuario efectivo) <strong>de</strong>l<br />

superusuario (usuario root).<br />

– Nos pregunta nuestro nombre <strong>de</strong> usuario (username) y nuestra palabra <strong>de</strong> paso (password).<br />

– Consulta en el archivo /etc/passwd cuáles son nuestros UID y GID, para hacer sendas<br />

llamadas a setuid y setgid, y que los i<strong>de</strong>ntificadores UID, EUID, GID y EGID pasen a ser los<br />

<strong>de</strong>l usuario que quiere iniciar la sesión <strong>de</strong> trabajo.<br />

– Luego llama a exec para ejecutar un intérprete <strong>de</strong> ór<strong>de</strong>nes que nos dé servicio. Esta shell se<br />

va a ejecutar con los i<strong>de</strong>ntificadores <strong>de</strong> usuario y <strong>de</strong> grupo, tanto reales (UID y GID) como<br />

efectivos (EUID y EGID), <strong>de</strong> acuerdo con el usuario que haya entrado en sesión.<br />

• Los procesos hijo van a heredar el UID, EUID, GID y EGID <strong>de</strong>l padre.<br />

<strong>2.</strong>7.5.3. Variables <strong>de</strong> Entorno.<br />

• Cuando un proceso empieza a través <strong>de</strong> una llamada a exec, el sistema pone a su disposición un<br />

array <strong>de</strong> ca<strong>de</strong>nas <strong>de</strong> caracteres conocido como entorno (environ).<br />

• Para los programas que se ejecuten mediante una llamada a execl, execv, execlp o execvp, el<br />

entorno es accesible únicamente a través <strong>de</strong> una variable global que se <strong>de</strong>clara como: extern char<br />

**environ;.<br />

• Para las llamadas execle o execve, el entorno es accesible también a través <strong>de</strong>l tercer parámetro <strong>de</strong><br />

la función main, el parámetro char **envp.<br />

• Tanto environ como envp tienen una estructura <strong>de</strong> array <strong>de</strong> ca<strong>de</strong>nas <strong>de</strong> caracteres terminado con un<br />

puntero NULL. Por convenio, cada una <strong>de</strong> estas ca<strong>de</strong>nas tiene la forma: Variable_entorno =<br />

Valor_variable.<br />

Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>44

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!