SISTEMAS OPERATIVOS II

Tercer curso Ingeniería Técnica Informática de sistemas. Curso 2006-2007

Práctica 3: Procesos en UNIX: Entorno, prioridades

Continuar la codificación de un intérprete de comandos (shell) en UNIX. Al igual que en la práctica anterior

En esta práctica el shell llevará cuenta de los procesos que tiene en segundo plano, informando de su estado con el comando jobs que se cita a continuación. La implementación de la lista de procesos en segundo plano es libre y solo debe llevarse contabilidad de los procesos en segundo plano lanzados desde este shell con el comando background; consecuentemente deberá modificarse el comando fork. Además se permitirá la creación de procesos y ejecución de programas con el entorno y/o las prioridades modificadas. El manejo de las prioridades se hará con las llamadas getpriority y setpriority

getenv [-e|-a]
Muestra la lista de todas las variables de entorno. Para cada variable de entorno muestra, en una misma línea, la variable (nombre=valor), la dirección de memoria donde se almacena la variable (el valor de la variable e[i] como puntero) y la dirección de memoria donde se almacena el puntero (&e[i]). El acceso será mediante environ (-e) o mediante el tercer argumento de main (-a).

entornos
Muestra el valor (como punteros) del tercer argumento de main y de environ así como las direcciones de memoria donde están almacenados el tercer argumento de main y environ. Ejemplo

#getenv
......
.......
.......
ffbefcb8->env[29]=(ffbeff86) PATH=/usr/bin:/usr/local/bin:
ffbefcbc->env[30]=(ffbeffa5) LC_MONETARY=es
ffbefcc0->env[31]=(ffbeffb4) LC_COLLATE=es
ffbefcc4->env[32]=(ffbeffc2) _INIT_NET_STRATEGY=none
#entornos
20a34->environ=ffbefc44 | ffbefc24->env=ffbefc44  | ffbefc20->argv=ffbefc3c
#

get var1, var2 ...
Devuelve los valores de las variables de entorno var1, var2 .. obtenidos mediante el tercer argumento de main, environ y la función de librería getenv. Para cada caso imprime además la dirección de memoria donde está la variable (su valor como puntero) y la dirección donde se almacena el puntero (salvo en el caso de obtenerla con getenv).

put -e|-a|-p var valor
Establece el valor de la variable de entorno var a valor accediendo a ella mediante environ (-e), el tercer argumento de main (-a) o la función de librería putenv. Si la variable no existe no la creará (informará de ello), salvo que se haya especificado que se haga mediante puntenv, entonces será creada.

sus -e|-a var nue=val
Sustituye de la variable de entorno var por nue=val accediendo a ella mediante environ (-e) o el tercer argumento de main (-a). Si la variable no existe informará de ello.

getpri [pid]
Informa de la prioridad del proceso pid. Si no se suministra pid informa de la prioridad del shell

setpri [pid] pri
Establece la prioridad del proceso pid a pri. Si no se suministra pid establece la prioridad del shell

 $$
modificar los comandos background, exec y comando para que pueda especificarse la prioridad y un entorno alternativo. El formato es

[background|exec] [lista_variables] ej [args] [*pri]

donde

ejemplos

# background xterm -e ksh *12

# exec TERM DISPLAY HOME HZ=120 N=65 ./a.out arg1 arg2 *-3

# TERM DISPLAY HOME USER NUEVA=PRUEBA /usr/bin/xterm -hold -e ./a.out

# ENTORNONULO ./a.out

jobs [-t] [-s] [-p] [-a]
Muestra una lista de los procesos ejecutados en segundo plano por ese shell. Para cada proceso mostrará, EN UNA SOLA LINEA, el pid, el momento en que fue lanzado, información del estado actual (activo, parado o terminado, junto con valor devuelto o señal según corresponda), la línea de comando con que fue lanzado y la prioridad. La opción -t no mostrará solo los que hayan terminado normalmente, la opción -s los que hayan terminado debido a una señal, la opción -p los parados y la opción -a los activos
clearjobs[-t|-s]
Con la opción -t eliminará de la lista los que hayan terminado normalmente; con -s los que hayan terminado debido a una señal. Si no se especifica opción eliminará todos los que hayan terminado.
proc pid
Nos da la informacion ampliada del proceso pid que devuelve wait4 en la estrcutura rusage
struct rusage {
   struct timeval ru_utime; /* user time used */
   struct timeval ru_stime; /* system time used */
   long   ru_maxrss;        /* maximum resident set size */
   long   ru_ixrss;         /* integral shared memory size */
   long   ru_idrss;         /* integral unshared data size */
   long   ru_isrss;         /* integral unshared stack size */
   long   ru_minflt;        /* page reclaims */
   long   ru_majflt;        /* page faults */
   long   ru_nswap;         /* swaps */
   long   ru_inblock;       /* block input operations */
   long   ru_oublock;       /* block output operations */
   long   ru_msgsnd;        /* messages sent */
   long   ru_msgrcv;        /* messages received */
   long   ru_nsignals;      /* signals received */
   long   ru_nvcsw;         /* voluntary context switches */
   long   ru_nivcsw;        /* involuntary context switches */
};

Información detallada de las llamadas al sistema y las funciones de la librería debe obternerse con man (execve, wait4, getenv, putenv..)

FORMA DE ENTREGA Como en prácticas anteriores

FECHA DE ENTREGA VIERNES 12 ENERO 2007