Unix
Unix
Unix
* ls /* −>
Ejemplo:
* chfn −> Nos permite cambiar el nombre < name > del finger.
Ejemplo:
k0123@asterix.fi.upm.es
* ftp −> Para poder conectarnos con otra máquina y poder traer ficheros.
Subordenes:
1
* help
download
ejecutarse
* prog −> prog < lo que sea > para buscar en archie.
2
* ps u a −> Todos los procesos de todos los usuarios.
* kill −> Mata procesos. kill −9 −1 mata todos los procesos y te hecha
a la calle.
concretamente.
* chmod −>
RESET
pctcp
win
Login: f931069
Password: ********
Para pasar ficheros de MSDOS a UNIX usaremos WFtp en el Administrador de programas de Windows.
Procederemos:
New
3
Hostname aulad
Password ********
Intro
931092 Mariano
931040 Carlos
UNIX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
− Manual
INDICE
1 Sistema de archivo
Dispositivo
− orientados a bloque
− sistema de protección
rwx−rwx−rwx
Archivos directorio
4
Conceptos básicos
− utilidades
− impresión
2 Procesos
Estado (ps)
Ejecución
− fork( ) secundaria
− exec solapada
Descripción de un lenguaje
− E/S
− estructuras de control
− subprogramas
1. Multiusuario
Requisitos de conexión:
1. Tarjeta de red
5
− Configuración hardware
2. Cableados
− Ethernet fino
− Ethernet grueso
− Par trenzado
3. Conectores
− T−BNC
− RJ−45
HARDWARE:
− tarjeta
− conectores
− cables
− concentradores
SOFTWARE:
− protocolo
− TCP/IP
DOS/WINDOWS
Utilidades
− telnet (sesión)
Programa ejemplo:
saludo.c
#include <stdio.h>
main( )
6
{
dir c:/fuentes
Sesión UNIX
$ls
saludo.c
saludo
$saludo
Hola mundo
1. Conectividad en red
Terminales virtuales: puede haber hasta 12 usuarios en un sólo terminal, conmutando con ALT+tecla de
función.
Ordenes de gestión de archivo (copia, borrado, enlace,...): cp, rm, ln, ls, cd, mkdir, rmdir, cat, more, find.
2. Multitarea
Tarea en memoria:
S.PILA.KERNEL
S.PILA
S.DATOS
S.CODIGO
Una tarea es un programa cargado en memoria al que se le asignan segmentos informativos para su contenido:
− segmento de pila
− segmento de datos
− segmento de código
7
− segmento de pila KERNEL (gestor de tareas del sistema operativo)
Las tareas tienen una identificación (PID y PPID) de tipo entero de 0 a 216. Establece un árbol de
dependencias de proceso.
Se determina un proceso inicial, PID0, nombre INIT. El proceso INIT se encarga de la inicialización y el
arranque.
Esquema:
login envía un proceso de conexión por cada terminal, que verifica la conexión de un teórico usuario al
sistema.
Después de la conexión tenemos como último proceso un intérprete de órdenes (shell, equivalente al
COMMAND.COM de MS−DOS), que será el padre de todos los procesos que se generen en un terminal.
El concepto de multitarea establece una serie de rangos. Hablamos así de procesos padres, hijos y huérfanos.
Se establece la relación tarea−familia.
Proceso huérfano: finaliza el proceso antes que el hijo. En este caso se le asigna como padre shell.
La identificación numérica de todos los procesos permite el envío de señales ($kill −9 432).
El modo diferido presenta el PID (entre corchetes) del proceso que se ejecuta. Se le asigna tiempo de CPU en
función de los requisitos. Se ejecuta en segundo plano (background).
EJ: ejecutar un programa todos los días a la misma hora, manteniendo la ejecución aunque finalicemos la
sesión UNIX.
Esta planificación permite definir contextos de prioridad (nice, sleep, wait) que permiten sincronizar y
8
planificar los procesos.
3 Sistema de seguridad
/etc/passwd
/etc/group
Estos ficheros contienen los usuarios que el administrador de sistemas ha dado de alta.
passwd /etc/passwd
ððððððð
group /etc/group
ðððð
LOS USUARIOS
PERTE. AL GRUPO
Tenemos como usuarios muchos programas, que modifican el sistema. Cada programa sólo puede ser usado
por el usuario que lo posee. Para ello, el usuario, al ejecutar un programa se convertirá en ese momento en el
administrador del sistema, por lo que podrá variar lo que quiera y alterar la instalación.
Esto se graba en un inodo, generándose una estructura de permisos de lectura, escritura y ejecución.
9
Variables del sistema umask 666
usuario rwx
otros rwx
Está a cargo de órdenes, se identifica como fsck (equivalecte a CHKDSK). Verifica la consistencia de la
estructura del superbloque con la lista de inodos.
La integridad del sistema desaparece si apagamos de golpe el ordenador, por lo que se ejecuta fsck al volver a
encender.
fsck /tmp
/lost+found
Virus en UNIX:
En MS−DOS se permite la existencia de primitivas que mantengan un párrafo de código en memoria, por
ejemplo KEEP.
Un vector de interrupción que se habilita 18 veces por segundo. Se varía cambiándolo por el código del virus.
Se produce pseudomultiprogramación.
En UNIX es más fácil localizar los programas en ejecución, por lo que se dificulta la entrada de virus.
−−− su −−−
stty −echo
read x
stty echo
sleep 1
10
echo Clave errónea
rm su
Sirve para cambiar de usuario. Nosotros simulamos el programa su para encontrar el password del
administrador.
Con un parámetro para el login creamos un fichero temporal tempxxx, donde xxx es el PID del proceso echo.
Hacemos creer al administrador que se ha equivocado al introducir el password y después borramos el su. El
administrador ejecuta esta vez el su verdadero sin haberse percatado de lo ocurrido.
A veces, dependiendo del nivel en que nos movamos, podemos ver el sistema de archivo como una secuencia
de bloques lógicos, cada uno de los cuales tiene un tamaño fijo (múltiple de 512 bytes).
%/etc
%/tmp
%/spool
inodo
11
[fecha último acceso ] lectura
CAMPO INODO
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
TIPO ARCHIVO ð ð ð USUARIO GRUPO OTROS (ACCESIBILIDAD AL ARCHIVO) 100 r − lectura, 010
w − escritura, 001 x − ejecución
TIPO DE ARCHIVO
1000 ORDINARIO
0100 DIRECTORIO
Existen otros 10 campos de direcciones a bloques de datos. En ellos se almacena el contenido de los datos,
son de indexación directa.
Indirecto simple: contiene la dirección a otro bloque de datos que a su vez contiene direcciones a bloques de
datos.
%%%%%
%%%%% %%%% [ ]
12
%%%%%%% %%%% . . .
%%%%% %%%%
%%%%% %%%% [ ]
Indirecto doble (con dos niveles de indexación), indirecto triple (con tres niveles de indexación).
/usr/include
stat.h
filsys.h
...
Son las fuentes de programación en C. Podemos ver aquí los campos que referencian a un inodo.
struct stat {
dev_t st_dev;
ino_t st_ino;
short st_mode;
short st_nlink;
short st_uid;
short st_gid;
dev_t st_rdev;
off_t st_size;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
};
/bin
13
/usr/bin
/tmp
/usr/tmp
Son directorios temporales. A veces funcionan como sistemas de archivo independientes. Tienen la función de
ser almacenamiento temporal para procesos.
/lib
/usr/lib
Gestión o creación de librerías para programas de desarrollo de utilidades. Un gestor incorporado en UNIX es
ar.
/usr
Implementa la estructura arborescente de usuarios. De él cuelgan los directorios accesibles por los usuarios.
/usr
% /games Juegos.
/etc
/dev
/mnt
14
boot init getty login sh
ððð
/group
Proceso boot
Establece la ejecución de distintos procesos, siempre asociados a ficheros que sirven de diseñadores.
Proceso init
Controla el nivel de ejecución del sistema. Es el padre de todos los procesos. Normalmente es el proceso 0. Se
encarga de ejecutar todas las acciones asociadas al fichero inittab. El fichero inittab se ubica en el directorio
/etc y tiene el siguiente formato:
EJ:
ls : 3 : initdefault
El segundo campo corresponde a niveles de ejecución. Normalmente de forma estándar van de 0 a 4. Estos
niveles están asociados a la primitiva del sistema init o /telinit. Si pongo en el prompt #init 3, se ejecutarán las
acciones que tengan un 3 en el segundo campo.
Admite:
− off
− once
− wait
− respawn
− boot
− initdefault
15
− off: Indica a init que detenga el proceso asociado al cuarto campo.
− once: Indica a init que debe ejecutar la orden del cuarto campo sin esperar a que termine.
− wait: sirve para que init ejecute el proceso del campo cuarto esperando a que termine.
− respawn: produce en init lanzar el proceso del campo cuarto. Si no existe, no espera a que termine, si existe,
no hace nada.
− boot: La acción sólo se ejecutará al arrancar el sistema. init ejecutará las líneas en las que aparezca la acción
boot siempre que arranque.
Campo cuarto: es el campo proceso. Normalmente es una orden shell que se ejecutará si la entrada estado
coincide con el nivel de ejecución.
EJ: Se pretende configurar un sistema para que sea usado por alumnos de TIF, ESCUELA y FACULTAD.
Habrá 5 terminales para cada tipo.
16
#init 2 : Habilita los 5 primeros terminales enviando logins.
− shutdown
− hatsys
bcheckrc (fsck)
init rc (sistema de impresión, inicializa soft de LAN, monta el sistema de archivo, ejecuta cron)
getty
init
cron: permite planificar y ejecutar procesos a largo plazo (procesos en modo diferido).
− getty: se ejecuta a partir de init y desde inittab. Va al fichero gettydefs, en /etc, donde se encuentra toda la
descripción de protocolos de los terminales.
En el 5º campo de gettydefs existe una cadena que hace de login de conexión (login: ). Está bajo la opción
respawn y espera un tiempo a que el usuario escriba su login. Si es escrito ejecuta un proceso.
17
Ejecución login:
− el fichero /etc/utmp contiene los usuarios conectados en el día actual. Cuando ejecutamos la orden who, este
archivo es consultado.
− el fichero /etc/wtmp contiene las conexiones establecidas en un tiempo determinado por el administrador.
Para conocer la estructura de estos archivios tenemos que a cada identificación de archivo le corresponderá un
archivo de librería:
/etc/utmp /usr/include/utmp.h
En función del shell incluido en el fichero passwd, podré ejecutar distintos shells (sh, csh, ksh, rsh).
18
GENERACION DE ARCHIVOS. IDENTIFICACION DE UN ARCHIVO UNIX
19
EJ:
ls capitulo[123]ð% (Capítulos 1, 2 y 3)
Orden ls
Formato:
ls −l archivoð%
−: ordinario
d: directorio
b: dispositivo de bloque
l: enlace simbólico
Grupo 1: usuario
Grupo 2: grupo
Grupo 3: otros
Puede ser:
r: lectura
w: escritura
x: permiso de ejecución
−: denegado
20
El campo 12 indica el usuario propietario, el 13 el grupo propietario, el 14 el tamaño del archivo en bytes (nº
de octetos) y el 15 la fecha de última modificación.
A continuación vemos en el cuadro cómo afecta a ficheros ordinarios y a directorios los permisos de
accesibilidad, que permitirán ejecutar unas órdenes concretas sobre ellos:
Operaciones permitidas
r w x
more
archivo ordinario
cat (type)
vi (edit)
exec
cp (copy)
cp
rm
directorio
ls mv
cd
cp
# chmod +x prog ð%
Defiinición de la accesbilidad
Para establecer el permiso y acceso a archivos. Existe la primitiva chmod y tiene 2 formatos, simbólico y
octal:
u
+ r
g
− w
o
−/= w/x
a
= x
u: usuario, g: grupo, o: otros, a: todos.
EJ:
$ ls −l f1
$ chmod g=rw, o= f1
21
$ ls −l f1
$ ls −l f2
$ ls −l f2
EJ:
755
Por defecto, para directorios se establece una accesibilidad de 777 (todos los permisos activados).
Existe una variable de entorno (umask) que eprmite definir los accesos por defecto.
EJ: ¿Qué debo hacer con la variable de entorno umask para que los archivos que genere aparezcan con los
permisos r, w y x para usuario y grupo y con −−− para otros, al crear directorios?
mkdir, rmdir, ls, cd, pwd, cat, rm, mv, cp, ln, more.
find
Permite localizar o buscar archivos a través de la estructura del sistema de archivos. La búsqueda es
condicional. Se pueden especificar múltiples condiciones de búsqueda.
22
Formato de find:
directorio es el origen de las búsquedas. La búsqueda se realiza recursivamente. Buscará desde el directorio
indicado en todos los subdirectorios.
opciones:
− print: muestra por pantalla los archivos con sus trayectoria completa
− perm: acompaña a una notación en formato octal. Busca desde un directorio determinado todos los archivos
que tienen el acceso indicado en octal.
− size n: busca archivos con n bloques de datos. Cada bloque de datos son 512 bytes. También permite −size
+n y −size −n.
− b: archivos de bloque
23
− d: directorios
− p: archivos ordinarios
− f: fifo
− OK xxx: ejecuta interactivamente la orden shell asociada con cada archivo buscado por find.
/usr/alumnos/1642527
% /prog.c
% /prog.for
% /prog.pas
% /fuentes
% /c
% /for
% /pas
Hay que mover todos los fuentes en C de todos los alumnos a /fuentes/c, los de FORTRAN a /fuentes/for y los
de PASCAL a /fuentes/pas.
Se comprobará si existen 2 ficheros de igual contenido con distinto nombre y se copiará sólo 1 de ellos.
24
Si 2 archivos tienen distinto contenido y el mismo nombre se renombrará uno de ellos.
EJ: Hay que hacer un programa que presente, para un directorio determinado, una tabla del siguiente modo:
$ estadistica /
directorios 64
fifo 14
dispositivos de bloque 50
dispositivos carácter 35
enlaces 14
PROGRAMACION SHELL
GESTION DE ARGUMENTOS
$0 $1 $2 $3
El número máximo de argumentos es 10. Desde $0 hasta $9. A partir de estos argumentos podremos hacer la
gestión estadística de archivos.
EJ:
^d (equivale a ^z de MS−DOS)
25
$ chmod +x ejer01ð%
o también
Podemos incorporar también un editor similar a edlin, vi. Traeremos los ejercicios editados en MS−DOS y los
convertiremos a UNIX:
$ mkdir guiones
$ cd guiones
doscp
Sintaxis:
GESTION DE ARGUMENTOS
$0 $1 $2 ... $n
char*argv[ ]
argc=nº argumentos
26
En UNIX−Shell:
fich1: parámetro
$# contador de parámetros
$! código de salida (exit code) de la última orden ejecutada en segundo plano (background)
$ prog ð% (INTERACTIVO)
$ prog& ð% (DIFERIDO)
Código de retorno
{i−} ERRORLEVEL
Reset (fich1);
then
begin $?
halt(1);
end;
{i+}
Variables Shell
Desplazamiento de argumentos
27
$ utilidad fich1 fich2 fich3 fich4
$0 $1 $2 $3 $4
$ shift
$0 $1 $2 $3
Shell también ofrece una copia de variables de entorno, inicializadas en la ejecución del fichero .profile.
MS−DOS c:\>setð%
UNIX $ setð%
var
valor: string;
begin
...
valor:=getenv("PATH");
writeln('path=',valor);
end.
$COLUMNS Nº de columnas.
$LINES Nº de líneas.
$CPATH Trayectoria de directorios sobre los que se accede (cd libros, busca libros dentro de todos los
directorios indicados en CPATH)
28
Variables asociadas al login:
Otras:
$IFS Separador de campos {:,%%, ð%}, controla las delimitaciones de estructuras de archivos en UNIX.
29
$RANDOM generador de valores enteros corto (16 bits) aleatorios.
init sh prog
$ x=Holað%
$ shð%
$ echo $xð%
...
$ echo $x
Hola
export HOME_PATH
Tratamiento de variables
variable=valor (Asignación)
Contenido y dirección
x=Hola
x: dirección
$x: contenido de x
El contenido de la variable es arbitrable por asignación interna o por la ejecución de procesos que establezcan
una asignación de contenido a la variable.
30
n=10
n='ls −l lio'
midir='pwd'
cd $midir
EJ(72):
setcolor yellow
IFS='
'
do
if [ $LOGNAME = $login ]
then
break;
fi
done
setcolor −n
exit 0
idð%
31
− Asigna a la variable línea cada línea de passwd mediante un for.
El contenido asignado a una variable es siempre alfanumérico. Para evaluar expresiones desde un guión shell
se recurre a la herramienta expr:
n=`expr 34+2`
(Las comillas '`' no son comillas, sino indican que se ejecuta un proceso.)
Parámetros de sustitución
${variable:−contenido}
${variable:=contenido}
EJ:
$ echo $DIR
$ echo ${DIR:−temp}
temp
echo ${DIR:=temp}
temp
echo $DIR
temp
${variable:−contenido}
Establece un valor por omisión. Si la variable no está declarada o es nula le asigna un contanido.
echo $DIR
$echo ${DIR:−temp}
temp
${variable:=contenido}
32
Asignación clásica.
echo ${DIR:=temp}
temp
echo $DIR
temp
ksh, csh: mantienen estructuras compuestas de datos (ARRAYS). El resto de shells sólo admiten variables
simples.
Entrada/Salida (E/S)
echo
read
Entrada:
read: Asigna el contenido de la entrada estándar a las variables que tiene como argumento de forma
posicional y a partir de separadores definidos (TAB,%%, ð%).
read a b c d
Nº Argumentos > Nº Variables: El resto de la asignación lo recibe la última variable. Se define como
asignación externa bloqueante por posición.
Salida:
echo: Es una orden básica de salida por consola, de carácter secuencial que incorpora secuencias de escape.
echo $HOME
Secuencias de ESCAPE
33
\b: retrocede un carácter
read nombre
nombre: _
Hola Pepe
printf(Hola \n)
EJ(37):
do
CONTIENE='wc −l $NOMBRE'
done
fichero:
c1 c2 c3
34
cat fichero | while read c1 c2 c3
do
echo $c1
echo $c2
echo $c3
done
EJ(11):
IFS=":"
do
if [ −z "$SHELL" ]
then
SHELL=/bin/sh
fi
echo"Nombre: $LOGIN, UID: $UID, GID: $GID, GCOS: $GCOS, Directorio: $DIR, Shell:$SHELL"
done
exit 0
ESTRUCTURAS DE CONTROL
Expresiones condicionales
35
true (0)
false (1)
Programa C:
exit (0) Salida correcta, exit (1) Salida con código de error
read directorio
then
else
fi
TEST
if test $# −eq 0
then
exit 1
fi
o también
if [ $# −eq 0 ]
then
36
exit 1
fi
Ambito de test
− evaluador de cadenas
− evaluador de enteros
Sintaxis:
Opciones:
−d: directorio
−f: ordinario
do
if test −d $VAR
37
then
echo $VAR
fi
done
Es un bucle for que evalua el nombre de las entradas de directorio. Test evalua el contenido de la variable y en
caso de que sea un directorio lo presenta en pantalla.
EJ(33): Llévese a un directorio "borrados" todos los archivos del directorio de trabajo ordinarios que
comiencen por 'a' y elimínense del actual.
mkdir borrados
do
if test −f $VAR
then
cp ./$VAR ./borrados
rm $VAR
fi
done
Si se ejcuta el guión shell más de una vez producirá un error, ya que la primera vez se creó el directorio
'borrados'. Para resolver el problema de existencia de un directorio aplicamos el siguiente algoritmo:
if cd borrados
then
cd ..
else
mkdir borrados
fi
Sintaxis:
38
test opción cadena
Opciones:
Sintaxis:
test n1 comparador n2
Comparadores:
−eq: igual
−ne: distinto
Además de estos tres tipos de gestión, test hace un tratamiento booleano residual:
Aparte de TEST existen otros modificadores de control. Es posible establecer la ejecución prograsiva de
órdenes, atendiendo a diferentes criterios:
39
$ ord1 || ord2
if
if condicion
then
acciones
else
acciones
fi
EJ:
if true
then
echo Hola
fi
$ if true ð%
> then ð%
> else ð%
> fi
if false
then
40
echo Hola
elif true
echo Adiós
fi
DIR=`pwd`
if [ $DIR = $HOME ]
then
fi
$ false $ true
$ echo $? ð% $ echo $? ð%
10
fichero false
exit 1
fichero true
exit 0
− exit
− break
if [ $# −eq 0 ]
then
exit 6
fi
exit: provoca una terminación del proceso en ejecución y un retorno de un código al proceso padre (shell).
exit se codifica en un entero corto (16 bits).
41
Código exit. Hay retorno de 2 valores distintos:
CODIGO SEÑAL
CODIGO EXIT
ð%%8 bits%% ð%8 bits%
while true
do
read numero
if test −n numero
then
break
else
...
fi
done
for
do
acciones
done
for var in 1 2 3 4 5
do
42
echo $var
done
Una de las aplicaciones más utilizadas del bucle for es la ejecución de procesos.
do
echo $var
done
Excepciones:
for a in *
do
echo $a
done
for a in $*
do
echo $a
done
for a in $
do
echo $a
done
43
EJ(50): Programa que gestione subdirectorios para programas fuente de C, PASCAL y FORTRAN.
if test ! −d prog_c
then
mkdir prog_c
fi
if test ! −d prog_for
then
mkdir prog_for
fi
if test ! −d prog_pas
then
mkdir prog_pas
fi
do
case $VAR in
*.c) directorio=./prog_c;;
*.p) directorio=./prog_pas;;
*)continue;;
esac
encontrado=no
do
then
44
encontrado=si
break
fi
done
if [ $encontrado=no ]
then
if test −a $directorio/$VAR
then
cp $VAR $directorio/$$_$VAR
else
cp $VAR $directorio
fi
fi
done
exit 0
case $var in
et1) acciones;;
et2) acciones;;
et3) acciones;;
esac
45
Las etiquetas admiten comodines.
case $var in
et1) acciones;;
et2) acciones;;
*) gestión_de_errores;;
esac
while condicion
do
acciones
done
until condicion
do
acciones
done
Archivos FIFO
Sincronización de procesos:
1. Creación: Usaremos mknod. Crea un nodo que se corresponde con un archivo especial.
Para crearlo:
$ cd /etc
$ mknod $HOME/fifo p
46
$ ls −l
pfw−rw−rw−
− Tienen longitud 0
AB
Productor Consumidor
El archivo FIFO que es abierto para escritura por un proceso, necesita que otro proceso lo abra para lectura. El
terminal queda bloqueado hasta que se ejecute la orden en modo diferido.
[543]
$ cat fifoð%
EJ:
$ cd /etc
$ mknod $HOME/fifo p
$ cd $HOME
[154]
47
$ cat fifo (Consumidor) {Aunque cambiemos el orden de productor y consumidor, este siempre acaba el
último)
Escribo el contenido de fifo en pantalla. Se abre para lectura y se bloquea hasta que el proceso productor le
suministre información.
Un proceso productor que genere mucha información a un archivo fifo puede llegar a ocupar los 10 bloques
de datos de indexación directa. En este caso el proceso productor se bloqueará en escritura hasta que un
proceso consumidor le libere de información.
Editor vi
Ordenes básicas:
vi fichero
i: inserción
A: añadir
x: borrar carácter
r: reemplazar carácter
R: reemplazar cadena
MODULOS
La programación shell no permite casi el diseño modular aunque es posible implementarlo. La sintaxis de
función es:
identificador ( ) {
orden(es)
En KShell las funciones van precedidas por la palabra reservada function antes de la estructura anterior.
EJ: Crear un guión shell para la gestión de un archivo con nombres y números de teléfono, que permita dar
48
altas, bajas, modificaciones y consultas.
altas( ) {
read nombre
read telefono
consulta( ) {
read nombre
do
if test $nombre = $u
then
break
fi
done
consulta( ) {
49
read nombre
borrar( ) {
read nombre
encontrado=false
do
then
else
encontrado=true
fi
done
if test | $encontrado
then
rm temp$$
else
rm datos.dat
mv temp$$ datos.dat
fi
50
}
# Menú principal
while true
do
clear
read opcion
case $opcion in
1) altas;;
2) bajas;;
3) consulta;;
4) exit 0;;
*) echo Error;;
esac
done
Ejercicios propuestos:
ARCHIVO 1 ARCHIVO 2
51
−−−−−−−−−−−−−−−−
ls
SYSTEM V
struct direct {
ino_t d_inode;
};
67
.
70
..
435
fich1
423
fich2
602
fich3
ls recorre el directorio y cuando encuentra el número de inodo se dirige a la lista de inodos y obtiene la
información de un fichero determinado.
52
La estructura del directorio se alberga en dir.h.
struct dirent {
ino_t d_ino;
short d_reclen;
short d_namelen;
char d_name[_MAXNAMLEN+1];
};
El registro contiene:
− nº de inodo
− nº de caracteres
También se crearon primitivas de funciones de gestión para este tipo de archivos, las cuales no existían en
SYSTEM V.
opendir
rewinddir
readdir
closedir
seekdir
con la posibilidad de usarlas desde C para gestionar la estructura de directorios en 4.3 BSD.
A nivel de usuario no es posible saber qué sistema se usa, pero a la hora de programar es fundamental
diferenciarlo.
53
Ejercicios propuestos:
EJ:
% /DOS
%/BORLANDC
%/BIN
%/INCLUDE
Diseñar la orden TREE de DOS con el sistema de archivo de directorio. Dependiendo del nivel en el que nos
encontremos habrémos de tabular o retroceder.
ARCHIVOS DE DISPOSITIVO
Trabajan con el concepto de bloque lógico. Las técnicas de indexación están ceñidas a la unidad (512 bytes,
normalmente). Usarán un buffer caché (área intermedia de E/S). Los archivos de dispositivo están ubicados en
el directorio /dev:
$ ls −al /dev/hd*
1, 0: Son el nº mayor y nº menor que funcionan como índices numéricos referenciando a una tabla interna de
Kernel que contiene las direcciones de memoria donde se localiza el driver de gestión de E/S de dispositivos.
− Identificación numérica (nº disco, partición, cilindros, pistas, sectores/pista) referenciando a un valor
cuantitativo de la densidad de información admitida por el dispositivo.
En los archivos:
54
/etc/checklist (ASCII)
/etc/mnttab (BINARIO)
$ mount
mnttab y checklist son archivos que asociarán el sistema de archivos con dispositivos de bloque.
− id directorio
− id dispositivo de bloque
[boot][superbloque][lista_de_inodos][datos][swap]
512
filsys es un registro que nos dice cuál es la estructura exacta del superbloque. Contiene el nº de inodos y
bloques de datos del sistema de archivo. Tiene un campo con la última fecha de actualización de superbloque
realizada por Kernel (que es el único que puede modificarlo).
sync y update son dos procesos que sincronizan y actualizan el suoperbloque con la lista de inodos.
− nº de bloques libres
− nº de inodos
− nº mágico, es el nº de la versión de UNIX en uso. Es un entero largo. Sirve para saber el tamaño de bloque
del sistema de archivo (512, 1024, 2048)
55
− Nombre del sistema de archivo y versión del S.O.
El superbloque almacena toda la información relacionada con el sistema de archivo. Para situarnos en el
superbloque:
Lista de inodos
GESTION DE CORREO
MAIL, MAILX
WALL
WRITE
NEWS
− Gestión de terminal (WALL, WRITE, órdenes para enviar desde un terminal a otro también conectado)
También se pueden enviar mensajes de forma diferida, sin que esté conectado el receptor.
/usr/spool/mail/$LOGNAME
WALL: órden de gestión de correo orientado a terminal. Permite enviar un mensaje a todos los usuarios
conectados. La lista de usuarios está en utmp y WALL supervisa dicha lista para averiguar que usuarios están
conectados. Envía un mensaje que acaba con ^d y que será supervisado por el administrador. El tipo de correo
que se enviará desde WALL será general, por ejemplo aviso de que se cerrará el sistema. No es posible
proteger nuestro terminal contra correo producido por WALL.
56
WRITE: Permite la comunicación con otro usuario conectado. Por ejemplo: WRITE uft21 tty02
TALK: divide el terminal en 2 áreas, una de emisión y otra de recepción. Tan sólo difiere de WRITE en la
presentación. La filosofía es la misma, se trata de gestionar un archivo secuencial.
MESG: Pemite activar o desactivar la recepción de mensajes. MESG N desactiva, MESG Y activa.
Con chmod go−w tty03 desactivaríamos el acceso al terminal tty03, causando el mismo efecto que tecleando
MESG N en el terminal tty03.
/etc/motd es un archivo que corresponde a las noticias diarias que cualquier usuario de la red que se conecte
debe conocer. Este archivo es supervisado por cada .profile de conexión de cada usuario.
NEWS presenta las noticias del sistema que se encuentran disponibles. Esta utilidad visualiza el contenido de
/usr/news, varios ficheros con formato ASCII, que se presentarán en función de su asignación. En el fichero
.profile existirán sentencias del tipo:
if [ −f /usr/news ]
then
news −n
fi
Visualizará los nombres de los archivos sin modtrar su contenido. Sólo presenta las noticias actuales, no las ya
pasadas de fecha. Hay un archivo que siempre referencia a la última fecha de consulta de news. Este es un
fichero oculto, .news_time y contiene la última fecha de consulta de las news.
Ej. Diseñar un programa que presente y gestione noticias en el directorio /usr/news, controlando la
fecha de última consulta.
Pasos a seguir:
Según Kernighan:
do
case $i in
*/.news_time) break ;;
57
*) echo news: $i ;;
esac
done
touch .news_time
touch es una utilidad suministrada con UNIX que crea un archivo con la fecha actual.
IFS='
'
do
case $i in
*'not found') ;;
*/.news_time) break ;;
*) echo news: $i ;;
esac
done
touch .news_time
IFS='
'
do
case $i in
*'not found') ;;
*/.news_time) break ;;
58
*) echo news: $i
cat $i ;;
esac
done
touch .news_time
MAIL/MAILX
MAIL permite enviar y gestionar correo recibido. Incluye la gestión de control remoto (a otro sistema UNIX
conectado). El envío de correo responde básicamente a los siguientes criterios:
$ mail usuario(s) ð%
o el uso de tuberías:
$ ls | mail andres ð%
if mail −e
then
fi
$ mail ð%
− emisor (cabecera)
− fecha de emisión
59
− tamaño del mensaje
$ mail ð%
#_
q, ^d guarda en el archivo buzón los mensajes que no están marcados para borrar y sale
r [usuario(s)] responde a la persona que envió el mensaje en curso y permite enviar copias a otros
w [fichero] vuelca el mensaje en curso a un archivo, omitiendo la cabecera y lo marca para borrar
Correo no enviable:
Si el usuario no existe:
60
a) se interrumpirá la creación del mensaje, presentando un error
$ uname −n, presenta el nombre de cada sistema UNIX de la red. Obtine la lista de sistemas activos para
comunicación mediante UUCP.
$ uname | grep nombre, presenta la información del sistema indicado si éste está conectado a la red.
Habrá que establecer una trayectoria de comunicación para enviar a ese sistema:
Permite de este modo establecer comunicación con un sistema en concreto y a partir de ahí con un usuario de
dicho sistema.
MAILX abarca la misma filosofía incorporando muchas más posibilidades de gestión y detalle en la
descripción de los mensajes (tamaño, nº de palabras, caracteres, buzón origen, ayuda extendida,...) y un
fichero de configuración que permite incorporar cualquier editor de mensajes (MAIL sólo permite ed).
Estructura de MAILX:
$ mailx ð%
headers (h)
help (?)
mail (m)
reply (r)
save (s)
undelete (u)
visual (v)
61
write (w)
delete
dp
− lista de mensajes
n nº de mensaje
ð mensaje actual
^ último mensaje
$ primer mensaje
n−m
usuario
− argumentos
− fichero(s)
− usuario(s)
b) Ordenar el array.
GESTION DE IMPRESION
62
− Sistema de archivo de impresión
El gestor es un proceso que se ejecuta en modo diferido o background de forma contínua, para controlar la
cola de impresión.
En MS−DOS existe el programa print, un programa residente que permanece activo en background. En
UNIX el gestor de impresión se mantiene activo durante toda la sesión. Se encarga de:
$ ps −ef
A partir de ps obtendremos las carecterísticas de cada proceso que se esté ejecutando. En el caso de lpsched:
lp 69 1 ? lpsched
En el fichero /etc/passwd hay una entrada para usuario, la entrada lp, que es la entrada de usuario para todos
los procesos relacionados con la gestión de impresión.
− Nº de proceso (PID):
Es un valor asignado por Kernel. Init se encarga de establecer la ejecución de los demonios del gestor de
impresión.
% rc
El valor que se le asigne será siempre un nº muy bajo, ya que procede del proceso init, que es el proceso de
valor 1.
− tty:
? indica que no está asociado a ningún terminal. Este proceso no morirá cuando un usuario cierre una sesión
63
en su terminal.
$ lpstat −r
Cuando tengamos que dar de alta una impresora, modificar una cola de impresión o efectuar cualquier
actualización estructural de impresión tendremos que desconectar previamente el gestor de impresión.
UNIX implementa una estructura de directorios con información sobre el gestor de impresión:
(1) /usr/bin
lp
lpstat
lpinfo
lpsetup
enable
disable
accept
reject
(2) /usr/lib
lpsched
lpschut
lpadmin
lpmove
contiene órdenes exclusivas y específicas para el uso de la administración (alta de impresoras, activación y
desactivación de trabajos, etc.).
(3) /usr/spool/lp
FIFO
SCHEDLOCK
64
log
oldlog
seqfile
default
contiene los ficheros de configuración del subsistema de impresión y ficheros temporales a los trabajos que se
están imprimiendo.
SCHEDLOCK: es un archivo de bloqueo, utilizado por el gestor de impresión para evitar la múltiple
autoejecución. Impide que el gestor de impresión se ejecute más de una vez.
lod y oldlog: contienen registros de los trabajos que han sido impresos y de los que se están imprimiendo.
seqfile: contiene el valor numérico de identificación de la petición actual de impresión, de modo que lpsched
sabe cuántos archivos esperan para impresión.
/usr/spool/lp/model
Es un directorio de modelos que contiene las impresoras que hay en el mercado por marca, modelo y tipo de
conexión (serie o paralelo). Cada modelo es un guión shell que relacionará la orden de impresión de usuario
(lp) con el dispositivo físico que representa la impresora. Sincronizará y representará la información para
determinado dispositivo físico.
/usr/spool/lp/requests
Contiene subdirectorios, uno por cada impresora establecida, donde se ubicarán los trabajos que le
pertenezcan a cada impresora.
Tipo de impresora: Las impresoras actuales permiten ambos tipos de conexión (serie y paralelo). Para
establecer el protocolo de comunicación se usará un sistema hardware (jumpers) o software (si el periférico lo
permite).
Interface de conexión: Es la tarjeta con los puertos asignados. Seguiremos la siguiente tabla para identificar
el puerto con el dispositivo:
/dev/lp
LPT1
PARALELO
/dev/lp1
LPT2
/dev/lp2 PARALELO
LPT3
/dev/lp3 PARALELO
LPT4
/dev/lp4 PARALELO
65
COM1
/dev/tty00 SERIE
COM2
/dev/tty01 SERIE
COM3
/dev/tty02 SERIE
Pasos a seguir:
a) Comprobar la conexión:
b.3) en caso de fallar los dos pasos anteriores crear un guión shell
En UNIX habrá una cover−page por cada impresión que hagamos. En el guión shell podemos ver su
estructura.
Será necesario entrar en el sistema como root. Usaremos /usr/lib/lpschut para desactitvar el gestor de
impresión o también podemos optar por enviar una señal con kill −9 ó −15.
f) Habilitar la impresora:
66
g) Activar la impresora:
De este modo será capaz de recibir trabajos. Se hará mediante la orden accept del directorio /usr/bin.
Ejemplo:
IMPRESION
Sintaxis:
lp [opciones] [fichero(s)]
Opciones:
−m: notifica al usuario la impresión mediante el envío de un mensaje por correo electrónico una vez
finalizada la impresión del archivo.
Estado de impresión
lpstat presenta información sobre las peticiones de impresión y sobre las impresoras.
Sintaxis:
Opciones:
−a: muestra en pantalla cuáles de los dispositivos listados aceptan o no peticiones de impresión.
67
−r: presenta el estado del controlador de impresión (lpcheck).
Control de impresión
Si se detectan anomalías en una impresora tendremos que desactivar el gestor de impresión para suspender los
trabajos en espera. Usaremos /usr/lib/lpschut y cancel identificativo para cancelar la impresora en cuestión.
Si queremos definir el error que ha producido la anomalía para que todos los usuarios conozcan el porqué de
la desactivación del dispositivo usaremos la orden reject. Por ejemplo: /usr/lib/reject −r 'laser sin papel'
identificador.
Tendremos que mover todos los trabajos de dicha impresora hacia otro dispositivo si queremos seguir
imprimiendo con /usr/lib/lpmove identificador nuevo_identificador.
2. PROCESOS
cc {compilación} cc fuente.c
ðð
a.out.h es un archivo de librería que contiene las estructuras de datos que componen un fichero ejecutable.
man a.outð% nos devuelve la información proporcionada por el manual on−line que explica lo que es un
ejecutable.
68
1. Header: encabezamiento, estructura de datos que proporciona, mediante un número, la dirección donde se
carga el proceso. También indica los tamaños que conforman un archivo ejecutable; el segmento de datos,
segmento de código y tabla de símbolos.
2. Segmento de datos inicializados: variables globales y variables estáticas. Almacena todas las variables a
un valor definido antes de la ejecución, en este área (BSS).
3. Segmento de código: compuesta por todas las instrucciones del algoritmo en código máquina.
Ficheros que interpreta y ejecuta el shell, siendo previamente analizados lexicográficamente (similar a un
intérprete de órdenes como QuickBasic). Un ejemplo son los guiones−shell (ASCII).
Ej:
#include <stdio.h>
main ( )
int pid;
pid=fork( );
if (pid>0)
else
Cuando se generan 2 procesos, ambos tienen las mismas instrucciones y se ejecutan concurrentemente.
fork dará valor 0 al proceso hijo y el pid del proceso hijo al proceso padre (un valor entero positivo).
69
fork: genera la creación de un nuevo proceso.
− variables de entorno
Cuando un programa es cargado en memoria, en UNIX, se copian las áreas del ejecutable, construyendo:
−−−−−−−−−−−−
−−−−−−−−−−−−
−−−−−−−−−−−−
Area de kernel: guarda una pila por cada proceso, donde se almacenará el contexto del proceso en ejecución,
antes de cada llamada (multiproceso).
El area dinámica de datos gestiona los datos de modo dinámico y no estático (heap=montículo).
Ej:
guion
70
orden1 > archivo1& equivale a un fork ( );
fork ( );
AB
wait
wait es una sentencia de sincronización. Desempeña una función de espera hasta que terminen los procesos
hijos asociados. Esta sentencia suspende la ejecución de sentencias y espera hasta que el/los proceso/s hijo/s
terminen. Entonces el proceso padre continúa su ejecución.
Estados de un proceso:
EJECUCION USUARIO
llamada retorno
al sistema
retorno de interrupción
EJECUCION
despertar EJECUCION
Estados:
1 EJECUCION USUARIO: el programa ejecuta las instrucciones de un algoritmo codificado por un usuario.
2 EJECUCION KERNEL O SUPERVISOR: el programa hace una llamada al sistema; gestión de archivos
(open, read, write, ...), gestión de procesos (fork ( ), exec), etc.
3 LISTO PARA EJECUCION: el proceso no se ejecuta, pero está listo para ser ejecutado. Por ejemplo,
71
cuando un proceso necesita memoria y la paginación establecida no le puede servir memoria suficiente,
cuando se libere memoria, el planificador lo pasará a ejecución.
4 DORMIDO: estado que está determinado por operaciones de E/S. Por ejemplo, una operación de lectura,
hasta que no llegue una señal que libere al proceso de la E/S, el proceso no saldrá de este estado.
Tipos de proceso:
− fork ( )
− exec
Ej:
guion
exec date
Este guión shell ejecuta date y solapa el segmento de código de date sobre el proceso principal, que es el
guión shell. Aparecerá la fecha, pero la línea de echo nunca aparecerá, ya que habrá sido sobreescrita por el
segmento de código de date.
Ej: Hacer dos guiones shell, uno principal y otro secundario subordinado:
Salida:
iiiih! padre
ooooh! hijo
$ ps −l
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME COMD
Campos:
72
F: referencia indicadores o flags que establecen las características del proceso. Los flags hexadecimales más
frecuentes son:
O: proceso en ejecución
S: proceso dormido
Z: proceso zombi
UID: indica el nº de identificación de usuario propietario del proceso activo en memoria en ejecución
C: asociado a la planificación del gestor de procesos. Se refiere a las CPUs y FPUs presentes en el sistema
PRI: valor de la prioridad de ejecución del proceso. A mayor valor le corresponderá peor prioridad
NI: valor nice de prioridad. Se establece para calcular la prioridad (PRI). Es un valor entero, por defecto se
asigna 20 al proceso
ADDR: dirección física de memoria donde se almacena el proceso. Si el proceso está volcado en memoria
externa la dirección toma el valor de 0
WCHAN: dirección de espera de un evento. Es una dirección de memoria donde se establece la gestión de
una señal
73
TTY: terminal asociado al proceso. Si es un proceso demonio, no asociado a terminal, vale ?
Opciones:
Ej:
Ej: Realizar un guión shell que nos permita presentar las dependencias de los procesos.
148
149
183
260
264
268
Se intentará simular recursividad. Este guión shell ejecutará una función denominada proceso:
proceso ( )
IFS='
'
do
if [ $2 −lt 14 ]
then
IFS=' '
74
ppid='echo $i | cut −f3 −d" "'
if [ $ppid = $1 ]
then
tabular=$2
until [ $tabular = 0 ]
do
done
tabular=`expr $2 +2`
wait
fi
fi
done
# programa principal
proceso 1 0
exit 0
Ejercicios propuestos:
Ej: Guión shell que se ejecute cada 5 minutos y que calcule el nº de páginas de los procesos que están
activos en memoria. Si este nº excede un valor constante determinado, eliminará los procesos de menor
prioridad (aquellos con menor valor en el campo 'PRI' de ps).
Ej: Codifíquese un guón shell que elimine los procesos de aquellos usuarios cuya clave de acceso eté
caducada.
75
Comunicación entre procesos
Niveles de sincronización:
FIFO (tuberías):
Ej: ls | sort
Proceso a: ls
Proceso b: sprt
La tubería (|) sincroniza ambos procesos. El proceso b no se ejecuta mientras a no haya terminado. Este
método se denomina como tubería sin nominar.
Tuberías nominadas:
$ ls −l > fifo&
$ cat fifo
ls es el proceso productor que envía la información generada al archivo fifo que es una tubería nominada. cat
desbloquea el proceso anterior, generando la información, es el proceso consumidor.
SEÑALES:
Una señal es un evento prodeucido por el Kernel o por un proceso de usuario. Su estructura básica de datos es
un valor de tipo entero y su funcionalidad está determinada por la comunicación entre procesos. Es semejante
al tratamiento de interrupciones en MS−DOS.
Existen varios tipos de señales. UNIX SYSTEM V incorpora 19 señales básicas. A partir de estas los
diferentes distribuidores añaden nuevas señales. XENIX y BERKLEY incorporan alrededor de 30 señales.
El archivo SIGNAL.H recoge todos los valores de cada señal. Podemos visualizarlo con KILL −L.
8 SIGFPE
76
4 SIGILL
Terminan el proceso y establecen una copia en disco del proceso como "core".
Por ejemplo, cuando un programa quiere acceder a una dirección de memoria que no le corresponde o cuando
se hace un cálculo matemático que requiere coprocesador. Si no hay un coprocesador presente en el sistema
obtenemos errores en coma flotante.
5 SIGTRAP
16 SIGUSR1
17 SIGUSR2
EMITIR RECIBIR
kill
Formato:
Si pid=0 envía la señal a todos los procesos, a excepción de los procesos 0 y 1 pertenecientes al mismo grupo
que el proceso emisor.
77
Ej: Se tiene el fichero salir:
echo adios
kill −9 0
Visualiza adios y sale al login. Equivale a usar logout, ^d, exit, ...
Si pid=−1 se envía la señal a todos los procesos, a excepción de los procesos 0 y 1, de los cuales el propietario
real es el propietario efectivo del emisor.
Ej:
aplicación El propietario real y el propietatio efectivo coinciden. Ambos son el administrador. La aplicación
puede ser usada por todos los usuarios del ð sistema.
trap
Es un receptor de señales.
Ej:
while true
do
echo hola
done
Este es el prototipo de la recepción de señales. Este programa presenta indefinidamente hola hasta pulsar ^C,
momento en el cual se activará la captura de señal y se ejecutará 'echo adios; exit 0'
78
1 ACCION POR DEFECTO
2 IGNORAR LA SEÑAL
3 FUNCION ASOCIADA
1) Fin de proceso
3) Ignorar la señal
4) Asociada a la suspensión del proceso. Al recbir una señal un proceso suspende su ejecución y vuelca su
contenido a disco en espera de que otra señal reanude su ejecución.
En la versión 4 de UNIX:
IGNORAR LA SEÑAL
No hará absolutamente nada al recibir la señal. Señales como la 9 no podrán ser ignoradas.
Ej:
while true
do
done
Aunque enviemos una señal de interrumpir al proceso este no se verá afectado y seguirá visualizando la línea
de echo. Si se envía por segunda vez un ^C entonces si será interrumpido, ya que las señales necesitan
realimentarse, porque su valor es booleano.
Ej:
while true
79
do
echo Hola
done
De este modo no se podrá interrumpir con varias pulsaciones de ^C porque la recepción de la señal se está
realimentando dentro del bucle. Se asemeja a BREAK=OFF de MS−DOS.
FUNCION ASOCIADA
Ej:
while true
echo adios do
done
Ej:
adios( )
echo adios
#Programa principal
while true
do
echo hola
done
80
Ej: Crear un usuario que permita echar abajo el sistema si se interrumpe la ejecución del archivo
.profile.
PLANIFICACION DE PROCESOS
nohup permite que le proceso continúe ejecutándose después de que el usuario se haya desconectado del
sistema. Impide que una señal de fin de sesión interrumpa la ejecución de la orden.
Formato:
Ej:
orden fichero&
batch ejecuta tareas cuando la carga de CPU los permita. Es inmune a la señal de fin de sesión.
$ batch ð%
^d
$ at hora fecha ð%
^d
Opciones:
Ej:
cron es un proceso demonio que se carga en el proceso init y ejecuta archivos identificados como crontab.
Este proceso visualizará y gestionará este tipo de archivos verificando el tipo de órdenes que contienen y, si
81
son adecuadas a la fecha del momento, las ejecutará. Los archivos crontab son ficheros de texto con 6 campos,
6 cadenas separadas por blancos (o el IFS predeterminado).
Campos:
1. Minutos 0−59
2. Horas 0−23
6. Orden a ejecutar
0 1 * * 1 /usr/pepe/aplicacion
82