Índice de figuras xvÍndice de programas xvii
Índice de tablas xxi
Prólogo xxiii
1 Introducción
1.1 Estructura del sistema .1
1.2 Arquitectura del sistema operativo unix .3
1.3 Interfaz de las llamadas al sistema .5
1.4 Ejercicios .8
I El sistema de ficheros 11
2 Arquitectura del sistema de ficheros
2.1 Características del sistema de ficheros .13
2.2 Estructura del sistema de ficheros .14
2.2.1 El superbloque .15
2.2.2 Nodos índice (inodes) .16
2.2.3 Los bloques de datos.Estructura de un fichero ordinario .18
2.3 Tipos de ficheros en unix .23
2.3.1 Ficheros ordinarios .23
2.3.2 Directorios .24
2.3.3 Ficheros especiales .27
2.3.4 Tuberías con nombre .28
2.4 Extensiones del sistema bsd .29
2.4.1 Grupo de cilindros .30
2.5 Tablas de control de acceso a los ficheros .31
2.5.1 Tabla de nodos-i .31
2.5.2 Tabla de ficheros .31
2.5.3 Tabla de descriptores de fichero .33
2.6 Administración de los sistemas de ficheros .35
2.6.1 Particiones del disco .35
2.6.2 Formato del disco .35
2.6.3 Ficheros de dispositivo del disco .36
2.6.4 Construcción de un sistema de ficheros .38
2.6.5 Comprobación del estado de un sistema de ficheros .41
2.6.6 Montaje y desmontaje de un sistema de ficheros .42
2.6.7 Monitorización y contabilidad del sistema de ficheros .43
2.7 Ejercicios .44
3 Manejo de ficheros ordinarios
3.1 Introducción.51
3.2 Entrada/salida sobre ficheros ordinarios .53
3.2.1 Apertura de un fichero (open) .53
3.2.2 Lectura de datos de un fichero (read) .55
3.2.3 Escritura de datos en un fichero (write) .56
3.2.4 Cierre de un fichero (close) .57
3.2.5 Creación de un fichero (creat) .57
3.2.6 Duplicado de un descriptor (dup) .58
3.2.7 Acceso aleatorio (lseek) .58
3.2.8 Consistencia de un fichero .59
3.3 Biblioteca estándar de funciones de entrada/salida .59
3.3.1 Interfaz de la biblioteca estándar .59
3.3.2 Entrada/salida de caracteres con la biblioteca estándar .63
3.3.3 Implementación de la biblioteca estándar de entrada/salida .64
3.4 Control de ficheros abiertos (fcntl) .72
3.5 Administración de ficheros .77
3.5.1 stat, lstat y fstat .77
3.5.2 Modos de un fichero .78
3.5.3 Cambio de la información estadística de un fichero .81
3.5.4 Ejemplo de utilización de la información estadística de un fichero .83
3.6 Compartición y bloqueo de ficheros .87
3.6.1 Implementación de lockf a partir de open .91
3.7 Ejercicios .94
4 Manejo de directorios y ficheros especiales
4.1 Acceso a directorios .117
4.1.1 Creación de un directorio (mknod y mkdir) .118
4.1.2 Borrado de un directorio (rmdir) .119
4.1.3 Creación de nuevas entradas en un directorio (link) .120
4.1.4 Directorios asociados a un proceso (chdir y chroot) .121
4.1.5 Biblioteca estándar de acceso a directorios .122
4.2 Acceso a ficheros especiales .129
4.2.1 Entrada/salida sobre terminales .129
4.2.2 Control de terminales .135
4.3 Administración del sistema de ficheros .137
4.3.1 Montar y desmontar un sistema de ficheros (mount y umount) .137
4.3.2 Consistencia del sistema de ficheros (sync) .138
4.3.3 Estado de un sistema de ficheros .139
4.4 Ejercicios .144
II Procesos e hilos 157
5 Estructura de un proceso
5.1 Programas y procesos .159
5.2 Estados de un proceso .161
5.3 Tabla de procesos y área de usuario .164
5.4 Contexto de un proceso .165
5.5 Hilos y procesos ligeros .167
5.5.1 Hilos del núcleo .169
5.5.2 Procesos ligeros .169
5.5.3 Hilos del usuario .170
5.6 Distribución y planificación de procesos .171
5.7 Sistemas con requisitos de tiempo real .173
5.7.1 Planificación con prioridades fijas .173
5.7.2 Planificación con prioridades dinámicas .179
5.7.3 Planificación de tareas dependientes .179
6 Gestión de procesos e hilos
6.1 Ejecución de programas mediante exec .183
6.2 Creación de procesos (fork) .188
6.3 Terminación de procesos (exit y wait) .189
6.4 Información sobre procesos .195
6.4.1 Identificadores de proceso .195
6.4.2 Identificadores de usuario y de grupo .197
6.4.3 Variables de entorno .198
6.4.4 Parámetros relativos a ficheros .200
6.5 Control de la memoria asignada a un proceso .201
6.5.1 Asignación dinámica de memoria .202
6.5.2 Stiky bit .210
6.5.3 Bloqueo dememoria .211
6.6 Creación de hilos .212
6.7 Tratamiento de los errores .215
6.8 Atributos de un hilo .217
6.9 Cancelación de hilos .220
6.10 Funciones seguras y reentrantes .225
6.10.1 Funciones seguras para un uso concurrente .225
6.10.2 Funciones reentrantes .226
6.11 Planificación de hilos .227
6.12 Ejercicios .233
7 Señales y funciones de tiempo
7.1 Concepto de señal .239
7.2 Tipos de señales .240
7.3 Señales en el unix System V .243
7.3.1 Envío de señales (kill y raise) .243
7.3.2 Tratamiento de señales (signal) .245
7.3.3 En espera de señales (pause) .249
7.3.4 Saltos globales (setjmp y longjmp) .250
7.4 Señales en el sisTema 4.3bsd .252
7.4.1 Tratamiento de señales (sigvec) .253
7.4.2 Protección de zonas críticas .259
7.4.3 En espera de señales (sigpause) .260
7.4.4 Concepto de máquina virtual en el sistema bsd .262
7.5 Gestión de señales en posix .262
7.5.1 Tratamiento de señales (sigaction) .262
7.5.2 Envío de señales .267
7.5.3 Máscara de señales .268
7.5.4 Recepción síncrona de señales .274
7.6 Ejemplo de aplicación de las señales .276
7.6.1 Software tolerante a fallos .276
7.6.2 Sincronización de procesos .278
7.7 Funciones de tiempo .281
7.7.1 Fijación de la fecha del sistema (stime) .281
7.7.2 Lectura de la fecha del sistema (time y gettimeofday) .282
7.7.3 Tiempos de ejecución asociados a un proceso (times) .285
7.7.4 Temporizadores .288
7.8 Relojes, retardos y temporizadores en posix .294
7.8.1 Retardos .294
7.8.2 Temporizadores .295
7.9 Ejercicios .298
8 Perfilado, contabilidad y depuración
8.1 Perfil de un proceso .309
8.2 Contabilidad .315
8.3 Depuración de programas .322
III Comunicación entre procesos 331
9 Comunicación mediante tuberías
9.1 Comunicación entre procesos .333
9.2 Tuberías sin nombre .334
9.3 Comunicación bidireccional .337
9.4 Tuberías en los intérpretes de órdenes .340
9.5 Tuberías con nombre .342
9.6 Comunicación dúplex .350
9.6.1 Interrogación periódica .351
9.6.2 Lectura conducida por eventos .356
9.6.3 Multiplexación mediante select .357
9.7 Ejercicios .359
10 Comunicación local entre procesos e hilos
10.1 Mecanismos IPC del unix System V .369
10.1.1 Formación de llaves .370
10.1.2 Control de las facilidades IPC desde la línea de órdenes .371
10.2 Semáforos .372
10.2.1 Conceptos generales .372
10.2.2 Petición de semáforos (semget) .373
10.2.3 Control de las estructuras de semáforo (semctl) .374
10.2.4 Operaciones P y V (semop) .376
10.2.5 Ejemplo de aplicación.Sincronización de procesos .377
10.3 Memoria compartida .379
10.3.1 Petición de memoria compartida (shmget) .379
10.3.2 Control de una zona de memoria compartida (shmctl) .380
10.3.3 Operaciones con la memoria compartida (shmat y shmdt) .381
10.3.4 Ejemplo: multiplicación concurrente de matrices .382
10.4 Colas de mensajes .387
10.4.1 Petición de una cola de mensajes (msgget) .389
10.4.2 Control de las colas de mensajes (msgctl) .389
10.4.3 Operaciones con colas de mensajes (msgsnd y msgrcv) .390
10.4.4 Ejemplo: bases de datos centralizadas .391
10.5 Semáforos en posix .397
10.5.1 Críticas a los semáforos .399
10.6 Cerrojos en posix .400
10.6.1 Atributos de un cerrojo .402
10.7 Monitores con interfaz de procedimiento .405
10.7.1 Variables de condición en posix .406
10.7.2 Atributos de las variables de condición .415
10.8 Ejercicios .415
11 Comunicaciones en red
11.1 Mecanismos IPC del sistema bsd .423
11.1.1 Protocolos y conexiones .426
11.1.2 Direcciones de red .427
11.1.3 Modelo cliente-servidor .428
11.1.4 Esquema general de un servidor y de un cliente .429
11.2 Llamadas para elmanejo de conectores .430
11.2.1 Apertura de un punto terminal en un canal (socket) .431
11.2.2 Nombre de un conector (bind) .433
11.2.3 Disponibilidad para recibir peticiones de servicio (listen) .434
11.2.4 Petición de conexión (connect) .435
11.2.5 Aceptación de una conexión (accept) .435
11.2.6 Lectura o recepción de mensajes de un conector .436
11.2.7 Escritura o envío demensajes a un conector .438
11.2.8 Cierre del canal (close) .439
11.3 Ejemplos de servidores y clientes .439
11.3.1 Ejemplos con conectores de la familia AF_UNIX .440
11.3.2 Ejemplos con conectores de la familia AF_INET .452
11.4 Miscelánea de llamadas y funciones .464
11.4.1 Nombres de un conector (getsockname y getpeername) .464
11.4.2 Nombre del nodo actual (gethostname) .464
11.4.3 Construcción de tuberías a partir de conectores (socketpair) .465
11.4.4 Cierre de un conector (shutdown) .465
11.4.5 Lectura del fichero /etc/hosts .466
11.5 Ejemplo de aplicación.Transferencia de ficheros .467
11.6 Ejercicios .483
IV Apéndices 485
A El lenguaje de programación C
A.1 Introducción.487
A.2 Ciclo de creación de un programa .488
A.2.1 Componentes léxicos del lenguaje .488
A.2.2 Estructura de un programa C .489
A.3 Tipos de datos .490
A.3.1 Tipos fundamentales .490
A.3.2 Operador sizeof .491
A.3.3 Tipos derivados .492
A.3.4 Punteros .492
A.3.5 Alias para los nombres de tipo .496
A.4 Expresiones y operadores .497
A.4.1 Operadores aritméticos .497
A.4.2 Operadores de relación y lógicos .498
A.4.3 Operadores para elmanejo de bits .498
A.4.4 Expresiones abreviadas .499
A.5 Sentencias de control de flujo .499
A.5.1 Proposiciones y bloques .499
A.5.2 Selección (if-else) .500
A.5.3 Selección múltiple (else-if) .500
A.5.4 Selección por casos (switch) .501
A.5.5 Bucle for .502
A.5.6 Bucle (while) .502
A.5.7 Bucle (do-while) .502
A.5.8 break y continue .503
A.6 Funciones .503
A.6.1 Paso de parámetros por valor y por referencia .504
B Desarrollo de aplicaciones en el entorno unix
B.1 Programaciónmodular .509
B.2 Fases de la compilación .511
B.3 Compilación de programas multimodulares .512
B.4 El preprocesador de C .513
B.5 Ejemplo de programa con varios ficheros .516
B.6 Gestión de bibliotecas de funciones .519
B.6.1 Programas ar y ranlib .519
B.6.2 Programa nm .523
B.7 Distribución de los ficheros de una aplicación .524
B.8 Automatización de trabajos .526
B.9 Documentación .531
B.10Ejercicios .536
C Resumen de llamadas al sisTema 541
Referencias 575
Índice alfabético