l
practica1
SISTEMAS OPERATIVOS II
Tercer curso Ingeniería Ténica Informática Sistemas. Curso 2010-2011
Práctica 1: Procesos en Unix: Entorno
Comenzar la codificación de un intérprete de comandos (shell) en UNIX. Nótese que los comandos
aquí descritos deben interpretarse de la siguiente manera
- Los argumentos entre corchetes [] son opcionales.
- Los argumentos separados por | indican que debe ir uno u otro, pero no ambos
simultaneamente.
- El intérprete de comandos debe aceptar y entender la sintaxis aquí propuesta, pero no tiene
que forzarla. (por ejemplo, si hay varios argumentos deben aceptarse en el orden especificado,
pero puede resultar mas cómodo de programar asumiendo que pueden ir en cualquier orden)
Además deben tenerse en cuenta las siguientes indicaciones
- En ningún caso debe producir un error de ejecución (segmentation, bus error ...).
La práctica que produzca un error en tiempo de ejecución no será puntuada. Excepcionalmente
se admitirá un error en tiempo de ejecución en algunos comandos: en estos casos se indicará explicitamente (***)
- No debe dilapidar memoria (ejemplo: variable que se asigna cada vez que se llama a una función y no se
libera). NO SE REFIERE A DECLARAR LOS ARRAYS DE TAMAÑO PEQUEÑO
- Cuando el shell no pueda ejecutar una acción por algún motivo, debe indicarlo con un
mensaje como el que se obtiene con sys_errlist[errno] o con perror() (por ejemplo,
si no puede cambiar de directorio debe indicar por qué).
- Las direcciones de memoria deben mostrase en hexadecimal.
- La información que se nuestra en pantalla no debe incluir en ningun caso líneas en blanco
(ni líneas de '*' ni de '=',...).
- El shell leerá de su entrada estándar y escribirá en su salida estándar, de manera que
podría ser ejecutado un archivo de comandos invocando al shell con su entrada estándar
redireccionada a dicho archivo.
El shell debe llevar una lista de directorios (análoga al PATH del bash) donde busca los ejecutables, de manera que cuando
se indica un orden al shell la ejecutará si
- la orden es un comando interno del shell (p.e. autores, getpid ...)
- la orden representa la trayectoria completa a un ejecutable, comenzando por "/", "./" o "../"
- la orden es el nombre de un ejecutable que está en uno de los directorios de la lista antes citada.
La implementación de dicha lista es libre pero NO DEBE implementarse como una variable de entorno. El comando del shell mipath
muestra y/o manipula dicha lista. Los directorios, salvo el raiz ("/") se especificarán sin la barra al final (/usr/bin y no
/usr/bin/)
Comandos a implementar en esta práctica
- fin
- Termina la ejecución del intérprete de comandos.
- exit
- Termina la ejecución del intérprete de comandos.
- autores
- Indica los nombres y los logins de los autores de la práctica.
- getpid [-p]
- Muestra el pid del proceso, con [-p] muestra el pid del proceso padre del shell
- cd dir
- Cambia el directorio actual del shell a dir.
- pwd
- Muestra el directorio actual del shell
- mipath
- [-add|-del|-find|-list|-clear|-path] [arg]
- mipath -add [arg] Añade el directorio arg a la lista de directorios. Si no se especifica arg muestra la lista de directorios
- mipath -del [arg] Elimina el directorio arg de la lista de directorios. Si no se especifica arg muestra la lista de directorios
- mipath -find [arg] Nuestra la trayectoria completa al fichero arg si este está en uno de los directorios de la lista. Si no se especifica
arg muestra la lista de directorios
- mipath -clear Vacia la lista de directorios
- mipath -list Muestra la lista de directorios
- mipath -path Añade los directorios de la variable de entorno PATH a la lista de deirctorios del shell
- mipath Muestra la lista de directorios
- entorno
- [-get|-set|-sus|-env] [arg1...] Muestra o modifica el entorno del shell
- entorno -get VAR1 VAR2 .... Muestra los valores de las variables de entorno VAR1, VAR2 .... Para cada variable muestra:
- accediendo mediante el tercer argumento de main: Su valor como cadena, su valor
como puntero (la dirección de memoria donde se almacena la cadena) y la dirección de memoria donde se almacena el puntero
- accediendo mediante environ: Su valor como cadena, su valor
como puntero (la dirección de memoria donde se almacena la cadena) y la dirección de memoria donde se almacena el puntero
- accediendo mediante la función de librería getenv: Su valor como cadena
y su valor como puntero.
-> entorno -get TERM HOME
mediante arg main 0xbf9a6810--> TERM=xterm (0xbf9a69f2)
mediante environ 0xbf9a6810--> TERM=xterm (0xbf9a69f2)
mediante getenv -->xterm (0xbf9a69f7)
mediante arg main 0xbf9a6864--> HOME=/home/antonio (0xbf9a6ec8)
mediante environ 0xbf9a6864--> HOME=/home/antonio (0xbf9a6ec8)
mediante getenv -->/home/antonio (0xbf9a6ecd)
->
- entorno -set [-a|-e|-p] var nuevovalor ...Cambia el valor de la variable de
entorno var a nuevovalor.-a indica acceso mediante el tercer argumento de main, -e mediante
environ y -p mediante la función de librería putenv. Si la variable var no existe
no la creará, a no ser que se especifique -p. En este caso putenv creará la variable automaticamente
si no existe
->entorno -set -p TERM xterm
- entorno -sus [-a|-e] var nuevavar=nuevovalor ... Sustituye la variable de
entorno var por la variable nuevavar con el valor nuevovalor.-a indica acceso mediante el tercer argumento de main y -e mediante
environ.
->entorno -sus -a TERM TERMINAL=xterm
- entorno -env [-a|-e] Muestra TODO el entorno del proceso. -a indica que se acceda mediante el tercer argumento de main y -e mediante environ.
Para cada variable de entorno mostrará
Además mostrará los valores (como puntero) del tercer argumento de main y environ y las direcciónes donde se almacenan.
->entorno -env -e
........
0xbfaa6388->environ[3]=(0xbfaa7716) TERM=xterm
0xbfaa638c->environ[4]=(0xbfaa7721) SHELL=/bin/bash
........
0xbfaa6404->environ[34]=(0xbfaa7fde) _=./entorno.out
0x8049854->environ=0xbfaa637c
0xbfaa62f8->env=0xbfaa637c
- fork
- El shell crea un hijo y se queda en espera a que ese hijo termine. (El hijo continua ejecutando el código del shell)
- ejecutar
- prog arg1 ... Ejecuta, sin crear proceso (es decir REEMPLAZANDO el código del shell)
el programa prog con sus argumentos. prog representa un ejecutable externo y para poder ser encontrado puede especificarse una
trayectoria completa hasta él (comenzando por "/", "./" o "../") o residir en uno de los directorios del la lista (mipath) del shell.
Debe usarse la llamada execv
- ejecutar
- prog arg1 ...* LISTAVARIABLES Análogo al comando ejecutar anterior salvo que ahora la ejecución es mediante execve y el entorno
se especifica en LISTAVARIABLES. LISTAVARIABLES es la lista de variables que conforman el nuevo entorno del proceso. Para ello la ejecución será memdiante execve. LISTAVARIABLES puede contener nombres de variables de entorno (el valor se obtiene de environ) o cadenas de la forma NOMBRE=VALOR (se suministra ya la variable con su valor, y la variable no tiene que existir previamente). Si LISTAVARIABLES es vacía (y se ha indicado el argumento *), la ejecución será mediante execve pero con un entorno vacío.
- prog
- arg1 ... El shell crea un proceso que ejecuta en primer plano
el programa prog con sus argumentos. prog representa un ejecutable externo y para poder ser encontrado puede especificarse una
trayectoria completa hasta él (comenzando por "/", "./" o "../") o residir en uno de los directorios de la lista (mipath) del shell.
Debe usarse la llamada execv
- prog arg1
- ...* LISTAVARIABLES Análogo al comando anterior salvo que ahora la ejecución (creando proceso en primer plano)es mediante execve y el
entorno se especifica en LISTAVARIABLES. LISTAVARIABLES es la lista de variables que conforman el nuevo entorno del proceso. Para ello la ejecución será memdiante execve. LISTAVARIABLES puede contener nombres de variables de entorno (el valor se obtiene de environ) o cadenas de la forma NOMBRE=VALOR (se suministra ya la variable con su
valor, y la variable no tiene que existir previamente). Si LISTAVARIABLES es vacía (y se ha indicado el argumento *), la ejecución será mediante execve pero con un entorno vacío.
ejemplos
-> ejecutar ./a.out
-> ejecutar ./a.out * TERM HOME DISPLAY NUEVA=nada USER
-> /usr/bin/xterm -e csh
-> /usr/bin/xterm -e csh * TERM HOME DISPLAY USER NUEVAVAR=desconocida
-> ls -l /home
Información detallada de las llamadas al sistema y las funciones de la librería debe
obternerse con man (fork, execv, execve, waitpid, getenv, putenv ...)
FORMA DE ENTREGA
Va a ser utilizado el servicio de recogida de prácticas suministrado por el Centro de Cálculo de esta Facultad y parte del proceso
de corrección de las prácticas va a ser automtico (compilación, listado de practicas entregadas etc) por lo cual deben entregarse exactamente como se indica a continuación:
FECHA DE ENTREGA VIERNES 29 OCTUBRE DE 2010