1.- Introducción y conceptos básicos

1.1.-El sistema operativo UNIX

Un sistema operativo es un programa que controla otras partes del ordenador tanto hardware como software. Permite además al usuario acceder a las facilidades que ofrece el sistema. Todo ordenador necesita de un sistema operativo.

UNIX comienza en 1969 como un proyecto de investigación de Bell Laboratories, estando disponible la primera versión comercial en 1977 y ganando rápidamente en popularidad y difusión.

Los objetivos que persiguieron los primeros diseñadores de UNIX fueron conseguir un sistema operativo que permitiera un desarrollo eficiente de programas, que fuera pequeño y eficiente en el uso de la memoria y fácil de mantener.

Los sistemas operativos, hasta la aparición de UNIX, estaban pensados para funcionar únicamente en el sistema en que eran desarrollados. Esto implicaba un gran esfuerzo en aprender un nuevo sistema operativo cada vez que se usaban sistemas distintos. Aplicaciones que funcionaban en un sistema no estaban disponibles en otros e incluso los propios programas requerían modificaciones para transportarlos a otro sistema.

Una de las razones que han hecho que UNIX haya alcanzado una gran popularidad es resolver estos problemas, pues permite transportarlo fácilmente a diferentes sistemas. Esto se consiguió diseñando el sistema operativo de forma que hiciera muy pocas suposiciones sobre la arquitectura de la computadora y escribiendo la mayor parte del sistema operativo en un lenguaje de alto nivel (C). Sólo una pequeña parte (el kernel) está escrito en lenguaje ensamblador.

Actualmente UNIX puede ser usado desde pequeños ordenadores personales a grandes computadoras. Así pues un programador puede encontrar las mismas herramientas de programación, entornos similares y ejecutar fácilmente sus programas en cualquier sistema que use UNIX.

1.2-Partes del sistema operativo

Las partes más importantes en que puede dividirse el sistema operativo UNIX son:
Kernel
Shell
UNIX file system

Además, normalmente con el sistema operativo se suministran otra serie de programas, utilidades para comunicaciones, editores, lenguajes de programación, etc, que no forman parte estrictamente del sistema operativo.

1.2.1-Kernel

Puede considerarse como el núcleo del sistema operativo y es leido cada vez que se inicializa el sistema. Realiza una serie de tareas básicas como son:

1.2.2-Shell

La forma que el usuario tiene de acceder a los servicios del kernel es mediante la shell. Se puede considerar como el interprete de comandos, que permite que los comandos y programas que tecleamos sean ejecutados.

En UNIX hay varios tipos de shell que ofrecen diferentes características:

Bourne shell. Es la original de UNIX y está disponible en todos los sistemas, sin embargo no ofrece las facilidades de interacción con el usuario que ofrecen las shell más modernas.

C shell. Es la que tenemos normalmente cuando nos abren la cuenta en el IAC, (aunque podemos pedir que nos pongan otra).

TC shell es similar a la anterior pero ofrece más facilidades para editar la línea de comandos de forma interactiva. En lo que resta del curso supondremos que estamos trabajando con la TC o C shell.

Korn shell y Bourne Again SHell proporcionan las facilidades de interacción de TC shell pero el lenguaje de programación en shell es más parecido al original Bourne shell que a TC o C shell.

En la tabla se muestra un resumen de las características más importantes de las distintas shells.

      
                    Bourne   C    TC   Korn   BASH
________________________________________________________


command history        No   Yes   Yes   Yes    Yes

command alias          No   Yes   Yes   Yes    Yes

shell scripts          Yes  Yes   Yes   Yes    Yes

filename completion    No   Yes*  Yes   Yes*   Yes

command line editing   No   No    Yes   Yes*   Yes

job control            No   Yes   Yes   Yes    Yes

________________________________________________________
* Esta opción no está puesta por defecto

Para cambiar de shell basta con teclear en la línea de comandos el nombre de la shell que deseemos (sh, csh, tcsh, ksh o bash). Sin embargo no podemos cambiar la opción que tenemos por defecto al entrar en la cuenta, si queremos cambiarla hay que pedirlo al administrador del sistema.

1.2.3.- Sistema de ficheros

La tercera parte que define el sistema operativo UNIX es la estructura de su sistema de ficheros. Un sistema de ficheros es un método lógico de organizar y archivar un gran número de información, de forma que sea sencillo hacer uso de ella. El fichero es la unidad más pequeñna en la que se puede almacenar información. UNIX considera como ficheros no sólo a los ficheros normales (en los que guardamos datos, programas, etc) sino también a los directorios y los dispositivos conectados al sistema.

El sistema de ficheros en UNIX está organizado en una estructura jerárquica de directorios que comienza en el directorio root representado por / .

Los directorios que cuelgan de root pueden variar dependiendo del sistema, aunque los mostrados a cotinuación, sí son comunes a todos los sistemas UNIX.

                              /(root)
                                 |
 ----------------------------------------------------
 |         |       |       |        |       |       |         
  /bin    /dev    /etc    /home    /lib    /tmp    /usr
El sistema UNIX permite tener muchos usuarios simultáneamente. Como usuario, cada uno tiene un directorio home en el que se sitúa cuando se conecta al sistema. Una vez conectado se puede cambiar de un directorio a otro indicando el nombre completo (pathname) del directorio al que queramos cambiar y utilizando el comando (cd). Ej: cd /usr/local/bin/ue. Si queremos saber en qué directorio estamos basta con teclear (pwd) y el sistema nos devolverá el nombre completo del directorio en el que nos encontramos.  Todo fichero y directorio pueden ser identificados por una lista completa de nombres de directorios, empezando en el directorio raíz y terminando en el fichero o directorio deseado. Por ejemplo: /usr/local/bin/ue. También se puede identificar un fichero o directorio por su localización en relación al directorio en el que nos encontremos. Tomando como ejemplo el anterior fichero, si nos encontramos en el directorio local, la localización del fichero `ue' en relación a este directorio sería: bin/ue.

Generalmente se utilizan dos puntos consecutivos (..) para representar el directorio inmediatamente superior al que nos encontramos. Por ejemplo, si nos encontramos en el directorio `bin', .. representa al directorio `local'. En la mayor parte de las shells los directorios de los usuarios (home) se representa con el símbolo  ~ .

Ejemplos:

[comun@volvo ~]$ pwd
[comun@volvo ~]$ cd /
[comun@volvo ~]$ pwd
[comun@volvo /]$  ls -> Muestra el contenido del directorio
bin         datos       export      impresion   lost+found  opt         sbin        tmp
boot        dev         floppy      lib         misc        proc        scratch     usr
cdrom       etc         home        localsoft   mnt         root        soft        var

[comun@volvo /]$ ls -F -> Muestra el contenido indicando los ficheros con un *, los directorios con una / y los links con @
bin/         datos/       export/      impresion    lost+found/  opt/         sbin/        tmp/
boot/        dev/         fichero *   floppy@      lib/         misc/        proc/        scratch@     usr/
cdrom@       etc/         home/        localsoft/   mnt/         root/        soft/        var/

1.3-Comandos y procesos

Cuando introducimos un comando, el sistema operativo ejecuta un programa. Mientras este programa esté funcionando se le denomina proceso. Cada proceso generado en el sistema tiene un número de identificación conocido como PID (proceso ID).

Los ficheros pueden clasificarse dentro de las siguientes categorías:

Los ficheros normales pueden tener contenidos muy diferentes, por ejemplo texto, imágenes, ejecutables, etc. Todos los ficheros tienen un propietario, los que creamos nosotros desde nuestra cuenta nos pertenecen y cada propietario es el que puede controlar los permisos de acceso a ese fichero.

Los directorios son ficheros que contienen referencias a otros ficheros. Aunque todos los ficheros se encuentran dentro de algún directorio, no residen realmente dentro de él. El directorio mantiene dos informaciones básicas sobre cada fichero contenido en él: El nombre y un número llamado inode number que es un puntero que le indica al sistema donde encontrar toda la información que necesita del fichero.

A la correspondencia entre el nombre de un fichero y el inode number se le denomina link. Un mismo inode number puede tener asociados varios nombres y nos podemos referir al fichero por cada uno de estos nombres.

Los dispositivos especiales son ficheros que representan dispositivos físicos como impresoras, dispositivos magnéticos, el ratón, etc. Se encuentran dentro del directorio /dev. Por ejemplo, si la salida por pantalla de un programa no nos interesa podemos enviarla al dispositivo /dev/null que en realidad no tiene un dispositivo físico asociado, perdiendose de esta forma la salida del progrma.
programa1 >/dev/null

Los pipes permiten enlazar la salida de un comando a la entrada de otro, esto se hace a través de la creación de un fichero temporal donde se guarda la salida del primer programa hasta que es leido por el segundo.