• No results found

4. CHAPTER FOUR : RESEARCH METHODS, PROCEDURES AND

4.4 THE POPULATION AND THE SAMPLE

En ocasiones puede resultar útil poder ejecutar desde un programa ejecutable una orden del intérprete de comandos. Para ello se usa la función de librería system cuya declaración es

#include <stdlib.h>

int system (const char *orden);

Esta función ejecuta el comando orden invocando al intérprete de comandos

/bin/sh y regresa después de que la orden se haya terminado de ejecutar. Si la invocación a /bin/sh falla, el valor devuelto por system es 127. Si se puede invocar al intérprete de comandos pero se produce algún error en la ejecución de la orden el valor devuelto es -1. Si el comando se ejecuta correctamente, la función devuelve la salida de la orden. Conviene recordar que muchas órdenes devuelven un valor después de

ejecutarse y que este valor indicará si la ejecución ha sido correcta o si se ha producido algún fallo y que tipo de fallo se ha producido. Por lo general en caso de una ejecución correcta devolverán el valor 0, y en caso de fallo otro número, positivo o negativo.

Ejemplo 2.41 :

Considérese el siguiente programa escrito en lenguaje C: #include <stdlib.h> #include <stdio.h> main() { int salida; salida=system("echo $PATH"); printf("\n Salida=%d \n",salida); }

Supóngase que al fichero ejecutable que resulta de compilar este programa se le denomina ver_path. Cuando se ejecute ver_path desde un intérprete de comandos se visualizará en pantalla el valor de la variable PATH (sino ocurre ningún error) y a continuación el valor contenido en la variable salida.

2.13 Resumen: ¿Qué hemos aprendido?

En este capítulo se describen algunos de los principales trabajos asociados con la administración del sistema UNIX, tales como gestión de usuarios, configuración de los permisos de acceso a los ficheros y el control de tareas.

1. Para poder acceder al sistema, se requiere un proceso de identificación que consta de la introducción del nombre de usuario (login) y de la contraseña de acceso (password).

La consola del sistema es el monitor y teclado conectados directamente al sistema. UNIX cuenta con acceso a consolas virtuales que permite más de una sesión de trabajo activa. Para acceder a la consola i : Alt + Fi.

Un intérprete de comandos (shell) es un programa de utilidad que permite al usuario comunicarse con el sistema. Lee las órdenes o comandos ue teclea el usuario, busca los programas ejecutables asociados, y los ejecuta. El formato general es

nombre_orden –opciones parámetro parámetro2…..parámetroN

Las opciones modifican el comportamiento por defecto de la orden. Los parámetros o argumentos aportan información adicional que usará la orden.

2. Los comandos de uso más común en UNIX se pueden clasificar por:

Manejo de directorios y ficheros: cambiar el directorio de trabajo (cd); conocer la ruta absoluta del directorio de trabajo actual (pwd); obtener información de un fichero o directorio (ls [opciones][fichero(s)]); crear nuevos directorios (mkdir dir1 dir2…dirN); copiar ficheros (cp fichero 1 fichero2…ficheroN destino); mover ficheros (mv fichero 1 fichero2…ficheroN destino); borrar ficheros y directorios (rm fichero 1 fichero2…ficheroN), acceder al contenido de los ficheros (more/cat fichero1 fichero2…ficheroN) donde more muestra el fichero pantalla a pantalla mientras que cat lo muestra entero de una vez.

Para acceder a las páginas del manual de ayuda de UNIX se emplea la orden man. Para especificar una determinado sección, se debe invocar man seccion.

Para editar un fichero, se puede invocar desde la línea de comandos a alguno de los editores ( p. ej. vi o nano). Otros editores se acceden a través de la interfaz gráfica X

como por ejemplo gedit o kwrite.

Para salir del sistema de forma segura se usa el comando shutdown. Los comandos

halt o poweroff apagan también la computadora, y para reiniciar se usa reboot. Para cerrar únicamente el intérprete de órdenes se teclea exit.

3. También se vió como el usuario root o superusuario es el único usuario del sistema UNIX que puede leer, modificar o borrar cualquier fichero en el sistema. Puede cambiar permisos y ejecutar programas especiales. Esta cuenta debe ser usada exclusivamente por el administrador del sistema. El carácter “#” es el marcador de la línea de comandos que indica al usuario si está en la cuenta root. El sistema almacena información sobre las cuentas de usuario en el fichero /etc/passwd, que contiene información sobre: nombre de usuario, identificador de usuario real (uid), identificador de grupo real (gid), contraseña, nombre real del usuario, directorio de trabajo inicial, e intérprete de comandos inicial.

El superusuario crea una nueva cuenta de usuario con el programa useradd o addusar, y para eliminarla usa userdel o deluser. Para deshabilitar temporalmente la cuenta sin borrarla, se coloca el carácter “*” delante de la clave encriptada de la línea correspondiente del fichero /etc/passwd.

El superusuario puede cambiar la información asociada a una cuenta de usuario a través del fichero /etc/passwd.

Cada usuario puede pertenecer a uno o más grupos, que le da ciertos permisos de acceso a un fichero. El fichero /etc/group contiene información acerca de los grupos de usuarios existentes en el sistema con la siguiente información: nombre del grupo, clave encriptada de acceso a un grupo, gid y el login de otros usuarios del grupo. La clave de acceso no se suele usar, y en dicho campo se escribe ‘*’, o ‘x’, que indica que la contraseña se encuentra en /etc/shadow.

El superusuario puede añadir nuevos usuarios a un cierto grupo, y puede añadir nuevos grupos con los comandos addgroup o groupadd.

4. La máscara de modo simbólica es una cadena de caracteres que muestra información sobre la máscara de modo del fichero, de estructura s9s8s7s6s5s4s3s2s1s0,

que se obtiene al ejecutar la orden ls -l. Cada carácter tiene un significado: s9 indica el

tipo de fichero, s8 y s7 indican si están habilitados los permisos de lectura y escritura para

el propietario del fichero; s6 da información sobre el bit S_IUID; s5 y s4 indican si están

habilitados los permisos de lectura y escritura para los miembros del grupo; s3 da

información sobre el bit S_ISGID; s2 y s1 dicen si están habilitados los permisos de lectura

y escritura para el resto de usuarios, y s0 informa sobre el bit S_ISVTX.

Para modificar la máscara: chmod{u,g,o,a} {+,-}{r,w,x,s,t} <ficheros>.

Aunque un fichero tenga la máscara de modo –rwxrwxrwx, los usuarios no podrán acceder a él a menos que también tengan permiso de lectura y ejecución para el directorio donde se encuentra el fichero.

5. Los intérpretes de comandos más importantes son Bourne y C. El nombre del intérprete de Bourne es sh, y el de C en la mayoría de las distribuciones es csh, con ruta de acceso /bin/csh.

La mayoría de los intérpretes de comandos tienen la capacidad de referirse a más de un fichero usando comodines tales como ‘*’, ‘?’, o ‘[]’.

Para cambiar la entrada y la salida estándar, se emplea un mecanismo de entrada/salida. Para redirigir la salida de una orden hacia un fichero se usa el carácter ‘>’ seguido por el fichero de salida. Para redirigir la salida estándar se usa el carácter ‘<’ seguido del nombre del fichero de entrada.

Se pueden escribir varias órdenes en una misma línea escribiendo ‘;’ entre ellas. Para conseguir que la salida de una orden se convierta en la entrada de otra orden, se emplea una tubería con el símbolo ‘|’.

Los alias son nombres alternativos a un comando que sustituyen el nombre verdadero. Para definir un alias se emplea el comando alias, y para borrarlo, unalias.

Los shell scripts son ficheros de texto que contiene programas escritos en el lenguaje del intérprete del comando, que incluye definición de variables y funciones, y el uso de

sentencias de if, while, for, etc. Las ventajas de los shell scripts son su portabilidad, y su facilidad de lectura e interpretación. En cambio, comparado con un programa compilado, es lento de ejecución, y el código es visible a cualquier usuario.

Los shell scripts se encabezan con comentarios que indican el nombre del archivo y lo que hace. Los comentarios se insertan anteponiendo el carácter ‘#’. La primera línea comienza con ‘#!’ y la ruta de acceso del nuevo intérprete de comandos con se ejecutará el script.

El fichero de texto donde se escriba el shell script debe tener permiso de ejecución para el usuario. Para saber si tiene permiso, se deje consultar la máscara de modo simbólica con ls -1, y modificarle, en el su caso, con chmod.

6. Un intérprete de comandos es un fichero ejecutable. Las órdenes que se pueden ejecutar en un intérprete de comandos pueden ser: órdenes internas (builtin commands), cuyo código de ejecución se encuentra incluido dentro del propio código del intérprete. Su ejecución no supone la creación de un nuevo proceso (ej: cd, pwd); y órdenes externas, que requieren de la búsqueda y ejecución del fichero ejecutable asociado a cada orden. Son programas ejecutables o shell scripts incluidos en la distribución del sistema, y suponen la creación de al menos un proceso nuevo (ej: ls,mkdir).

7. Las variables del intérprete de comandos son un conjunto de variables que se crean al ejecutar un intérprete de comandos. Estas variables son locales al intérprete y pueden ser utilizadas por todas sus órdenes internas. El comando set muestra todas las variables disponibles.

Para conocer el valor de una determinado variable, se usa el comando echo $variable. Se puede modificar el valor de una variable empleando el signo ‘=’.

Las variables de entorno son las variables del intérprete de comandos que proceden del entorno del proceso asociado al intérprete. Ej: UID es una variable de entorno, es de sólo lectura y especifica el identificado del usuario real del usuario. El comando env visualiza el listado de las variables de entorno.

Los cambios que se hacen en una variable de entorno no se pasan al entorno del proceso hasta que el usuario no exporta explícitamente dicho variable al entorno, mediando el comando export variable.

La variable de entorno PATH especifica las rutas de acceso a los directorios donde el intérprete debe buscar el fichero ejecutable asociado a una determinada orden externa. Para añadir una nueva ruta: PATH= ruta_nueva:$ PATH.

8. Cada proceso que se ejecuta por un usuario es una tarea para el sistema. El control de tareas es una utilidad que permite controlar el estado de las diferentes tareas que se están ejecutando en el sistema.

El comando ps muestra la lista de procesos que el usuario está ejecutando actualmente. Si se añado la opción –aux se muestra también la utilización del procesador y de la memoria.

El comando top muestra la ocupación en tiempo real de cada proceso, y se actualiza cada 5 segundos.

El comando jobs permite chequear el estado de un proceso.

Un proceso puede estar en primer plano o en segundo plano. El proceso en primer plano es el que interactúa con el usuario. El proceso en segundo plano no recibe ninguna señal desde el teclado, se ejecuta en silencio sin necesidad de interacción. Para ejecutar una tarea en segundo plano se añade el carácter ‘&’ al final de la orden. Los procesos también pueden ser suspendidos, e interrumpirlos.

Para eliminar un proceso, se usa el comando kill, y toma como argumento el pid

2.14 Autoevaluación. Comprueba lo que has aprendido

2A) ¿Qué es una consola del sistema? 2B) ¿Qué es un intérprete de comandos?

2C) ¿Qué orden se utiliza para crear un directorio? 2D) ¿Qué orden se utiliza para mover un fichero?

2E) ¿Qué comandos se pueden emplear para salir del sistema?

2F) ¿Qué información almacena el sistema sobre las cuentas de usuarios? 2G) ¿Cómo se obtiene la máscara de modo simbólica de un archivo?

2H) ¿Qué utilidad tiene el comodín ‘*’ y en que se diferencia del carácter ‘?’? 2I) ¿Se pueden asignar alias a los comandos?

2J) Explica qué es un shell script y sus principales ventajas e inconvenientes. 2K) Describe el funcionamiento de un intérprete de comandos.

2L) ¿ Qué es una variable de intérprete de comandos? 2M) ¿Qué es una variable de entorno?

2N) 14. Describe el funcionamiento de la variable PATH

2O) ¿Qué comando se emplea para la visualización de los procesos en ejecución? 2P) ¿Qué comando se emplea para eliminar un proceso?

3

ESTRUCTURAS DE DATOS DE CONTROL

DE PROCESOS EN UNIX

3.1 Objetivos Docentes: ¿Qué vamos a aprender?

 Descripción del espacio de direcciones virtuales asociado a un proceso,  Identificadores y las estructuras de datos del núcleo asociadas a un proceso.  Análisis de los diferentes elementos que constituyen el contexto de un

proceso.

 Tratamiento de las interrupciones por parte del núcleo  Interfaz de las llamadas al sistema.

 Conocimiento y descripción de los posibles estados de un proceso

3.2 Introducción

Cuando se compila un programa, el compilador suponiendo que dicho programa va a ser el único que se va a ejecutar en el sistema genera un espacio o conjunto de direcciones de memoria virtual asociadas a dicho programa. Este espacio es traducido por la máquina a un conjunto de direcciones de memoria principal. De esta forma, varias copias de un mismo programa pueden coexistir en memoria principal, todas ellas utilizarán las mismas direcciones virtuales, sin embargo tendrán asignadas diferentes direcciones físicas.

Una región o segmento es un subconjunto o área de direcciones contiguas de memoria virtual. En cualquier programa se pueden distinguir al menos tres regiones: la región de código o texto, la región de datos y la región de pila.

Un proceso es una instancia de un programa en ejecución. Consiste en un conjunto de bytes que la CPU interpreta como código (instrucciones máquina), datos o elementos de una pila. En un sistema UNIX los procesos parecen ejecutarse de forma simultánea, aunque, si se tiene una arquitectura monoprocesador, en un determinado instante de

tiempo, realmente sólo uno de ellos estará ejecutándose en la CPU. Asimismo pueden existir simultáneamente en el sistema varias instancias de un mismo programa.

Desde un punto de vista práctico, un proceso es una entidad que se crea con la llamada al sistema fork, el proceso que invoca a esta llamada se denomina procesopadre

y el proceso que se crea como resultado de la llamada fork se denomina proceso hijo.

Los procesos son unidades funcionalmente independientes ya que se debe tener en cuenta que un proceso no puede ejecutar instrucciones de otro proceso. Un proceso puede leer y escribir en sus regiones de datos y de pila, pero no puede leer ni escribir en las regiones de datos y de pila de otros procesos. Evidentemente ante esta situación se hace necesario implementar mecanismos de comunicación entre los procesos, materia que será objeto de estudio en el capítulo 7.

Puesto que UNIX es un sistema multitarea y multiusuario, el núcleo asigna a cada proceso varios identificadores numéricos con el fin de llevar un control de los procesos que se están ejecutando en el sistema y saber a qué usuarios pertenecen. Asimismo, el núcleo mantiene diferentes estructuras de datos asociadas a los procesos, las cuales son fundamentales para la ejecución de los mismos.

De manera poco formal, pero muy gráfica, se puede afirmar que el contexto de un proceso A es una “fotografía” de los valores de ciertas posiciones de memoria asociados al proceso A y de los registros de la CPU. En determinadas circunstancias, el núcleo debe realizar un cambio de contexto, es decir, aplazar o finalizar la ejecución del proceso A y comenzar o continuar con la ejecución de otro proceso B. Asimismo, cuando se produce una interrupción, una llamada al sistema o un cambio de contexto el núcleo debe salvar el contexto del proceso (“tomar una fotografía”).

En este capítulo, se describe el espacio de direcciones virtuales, los identificadores y las estructuras de datos del núcleo asociadas a un proceso. Asimismo, se analizan los diferentes elementos que constituyen el contexto de un proceso. Además se estudia cómo se salva el contexto de un proceso y cómo se realiza un cambio de contexto. También se describe el tratamiento de las interrupciones por parte del núcleo y la interfaz de las llamadas al sistema. La parte final del capítulo se dedica a enumerar y describir los posibles estados de un proceso, haciéndose especial hincapié en el estado dormido.

En la explicación de este capítulo se va a tomar como referencia principalmente el núcleo de una distribución clásica como SVR3. Las variantes modernas de UNIX tales

como SVR4, OSF/1, BSD4.4 y Solaris 2.x (y superiores) presentan ciertas diferencias con respecto a este modelo clásico.

3.3 Espacio de direcciones de memoria virtual asociado a un proceso