Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
INDICE
Tema 1 : Biblioteca Estndar
Pag 2
Pag 5
Pag 8
Pag 14
Pag 28
Tema 6 : Procesos
Pag 38
Tema 7 : Seales
Pag 46
Pag 52
Pag 59
Programacin de Sistemas
size_t
fpos_t
wchar_t
wint_t
Definiciones de macros :
#define NULL 0
#define EOF -1
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
Para punteros
Devuelto al leer ms all del final del archivo
Principio de archivo
Posicin actual
Fin de archivo
Entrada estndar
Salida estndar
Salida de errores estndar
Programacin de Sistemas
Significado
Abre un archivo de texto para lectura
Crea un archivo de texto para escritura
Abre un archivo de texto para aadir
Abre un archivo binario para lectura
Crea un archivo binario para escritura
Abre un archivo binario para aadir
Abre un archivo de texto para lect/escr
Crea un archivo de texto para lect/escr
Aade o crea un archivo de texto para lect/escr
Abre un archivo binario para lect/escr
Crea un archivo binario para lect/escr
Aadir en un archivo binario en modo lect/escr
Programacin de Sistemas
Programacin de Sistemas
1 Fase
Prog.i
2 Fase
Prog.s
Prog.o
3 Fase
Fases al ejecutar : $ cc
4 Fase
Ejecutable
Podemos indicar que se detenga en una fase concreta :
-P : Que se detenga en la primera fase (c sin macros)
-s : Que se detenga en segunda fase (ensamblador)
-c : Que se detenga en la tercera fase
Sin nada llega al ejecutable, que por omisin se llama a.out.
-o nombre : Para darle un nombre al ejecutable.
Las aplicaciones se pueden dividir en mdulos que son ficheros fuente con funciones de
control de flujo de la aplicacin.
$ cc m1.c m2.c .........mk.c -o ejec
Ms opciones :
$ cc -D macro $ cc -D macro = valor
-Aa : Compila en ansi. En caso contrario lo hace en pre ansi.
Programacin de Sistemas
Constructor make
Genero procesos de compilacin de proyectos en c bajo el paradigma de la
descomposicin funcional.
Fichero make :
ejec : s1.o s2.o
cc -o ejec s1.o s2.o
s1.o : s1.c define.h
cc -c s1.c
s2.o : s2.c define.h
cc -c s2.c
A este fichero se le puede dar cualquier nombre. Si se le llama pepe la ejecucin ser
$ make pepe y si se le llama makefile ser $ make.
Bibliotecas de enlace esttico ee y de enlace dinmico ed
Las libreras compartidas permiten que mltiples programas puedan compartir el cdigo de
las funciones incluidas en la librera. Este modo de compartir puede estar implementada de forma
esttica (ed) o dinmica (ee).
En una librera esttica las direcciones virtuales de las funciones son fijas y se enlazan
con el fichero a.out cuando se realiza el linkado, de manera que estas direcciones no se
modifican aunque las funciones sean modificadas. Cuando se realizan cambios en las funciones de
la librera es necesario conocer el espacio de direcciones disponible.
Las libreras dinmicas no residen en direcciones fijas de memoria y las funciones se
enlazan con el fichero a.out en tiempo de ejecucin. Las funciones se pueden cargar en
cualquier direccin de memoria.
Para crear libreras estticas se crean con el comando ar y tienen el nombre genrico
libxxx.a :
$ cc -c func1.c func2.c func3.c
$ ar -r libmia.a func1.o func2.o func3.o
La librera se podr enlazar con el ejecutable de la siguiente manera :
$ cc -ldirectorio main.c fich2.c -lmia
Las libreras dinmicas tienen el nombre genrico libxxx.so :
$ cc -c func1.c func2.c func3.c
$ cc -G libmia.so func1.o func2.o func3.o
Programacin de Sistemas
El editor de enlace incluir en el ejecutable con el que se enlace la librera el nombre del
objeto compartido asi como toda la informacin necesaria para gestionar el enlace en tiempo de
ejecucin.
$ cc -ldirectorio main.c fich2.c -lmia
Es posible incluir libreras estticas y otras libreras dinmicas en la lista de ficheros
especificados para formar la librera dinmica :
$ cc -G libmia.so -ldirectorio func1.0 func2.o func3.o -lcomp
La opcin dn permite desactivar el enlace con libreras dinmicas. La orden cc
proporciona otras dos opciones que permiten combinar enlaces con libreras dinmicas y
estticas :
$ cc -L/home/mlibs/ main.c fich1.c fich2.c -Bstatic lmia fich3.c Bdynamic -lcomp
En la lnea anterior se enlaza la librera esttica libmia.a para resolver las referencias
externas de main.c y fich1.c y fich2.c ; por otro lado se indica que emplee la librera libcomp.so
para resolver las referencias externas no resueltas de esos mismos programas y por ltimo que
emplee la librera estndar libc.so para resolver las referencias externas an no resueltas.
Opciones :
r
d
t
x
dn
Programacin de Sistemas
Aplicaciones
K
Subsistema
de
E/S
Subsistema
E
R
de
N
Subsistema
de
Ficheros
Procesos
E
L
Mquina
El nucleo (kernel) de Unix es un programa que siempre est residente en memoria y que,
entre otros, ofrece los siguientes servicios :
En la arquitectura Unix podemos distinguir tres niveles bsicos, que son el hardware (la
mquina), el kernel y en un tercer nivel los programas estndar (vi, grep....) y programas
generados por el usuario (a.out).
Estos programas del tercer nivel nunca se comunican de forma directa con el hardware,
por lo que debe existir algn mecanismo que nos permita indicar al kernel que necesitamos operar
sobre algn recurso hardware. Este mecanismo son las llamadas al sistemas (system calls).
Programacin de Sistemas
Las llamadas al sistema y su librera asociada representan la frontera entre los programas
de usuario y el kernel. La librera asociada es el mecanismo que nos permite invocarlas desde un
programa C. Los programas escritos en ensamblador pueden invocarlas directamente sin
necesidad de ninguna librera intermedia.
Las llamadas al sistema se ejecutan en modo kernel y para entrar en ese modo hay que
ejecutar una sentencia en cdigo mquina conocida como trap (o interrupcin software).
La forma de averiguar si una llamada ha fallado es analizar el valor que devuelve. Este
valor es -1 de forma estndar para todas las llamadas cuando se produce un error. Para determinar
el error producido hay que consultar la variable externa errno (en el fichero errno.h hay una
descripcin de los posibles valores que puede tomar esta variable).
Existen dos formas de obtener el mensaje de error asociado a la variable errno que se
exponen a continuacin.
Usar errno como ndice para acceder a la cadena correspondiente de sys_errlist[].
Usar la funcin de librera perror().
Funciones de cada subsistema
Subsistema de procesos
Administracin de la memoria
Planificacin de procesos
Comunicacin entre procesos
Gestionar la creacin y eliminacin de procesos
Sussistema de E/S
Subsistema de ficheros
Mantener en disco las estructuras de de los sistemas de ficheros
Mantener en memoria las estructuras de datos que agilicen el uso y la
compatibilidad de los sistemas de ficheros
Gestionar las llamadas al sistema sobre ficheros
Programacin de Sistemas
10
Programacin de Sistemas
inode
45
2
2359
4921
.
.
nombre fichero
.
..
ls
mount
.
.
Las dos primeras entradas (las que hacen referencia al directorio actual . Y al
directorio padre .. estn presentes en todo directorio. En el caso del directorio raz es el
programa mkfs (make file system) el que se encarga de que la entrada .. apunte al propio
directorio raz.
El kernel maneja los datos de un directorio con los mismos procedimientos con
que se manejan los datos de los ficheros ordinarios, usando la estructura inode y los
bloques de acceso directos e indirectos.
No hay razones estructurales que impidan la existencia de mltiples enlaces a un
directorio, sin embargo el kernel los prohibe.
Los permisos de acceso de un directorio tienen los siguientes significados :
Permiso de lectura : Un proceso puede leer ese directorio (ls)
Permiso de ejecucin : Un proceso puede buscar un nombre de fichero
Permiso de escritura
: Permite crear una entrada o borrar una existente
Estructura de un directorio en el sistema 4.3BSD
La diferencia bsica estriba en que los nombre de ficheros en este sistema pueden
tener una longitud mayor de 14 bytes y no se reserva un espacio fijo de bytes para cada
entrada del directorio.
Cada bloque de directorio se compone de tres campos : nmero de inodo, un
puntero al nombre de la entrada y la longitud del nombre.
Los procesos pueden leer el contenido de un directorio pero no pueden
modificarlo, esto es un privilegio del kernel.
11
Programacin de Sistemas
Este tipo de ficheros permiten comunicarse con los dispositivos perifricos (discos, cintas,
impresoras, terminales. Redes...). Hay dos clases de ficheros especiales :
Modo Bloque
El dispositivo contiene un array de bloques de tamao fijo (generalmente mltiplo
de 512 bytes) y el kernel gestiona un buffer cache que acelera la transferencia de
los datos. El bloque es la unidad mnima de informacin que se transfiere en cada
operacin de E/S.
Modo Carcter
La informacin no se organiza segn una estructura concreta y el vista por el
kernel, o por el usuario, como una secuencia lineal de bytes. Se pueden realizar las
operaciones de E/S en montones pequeos (por ejemplo carcter) o grandes (por
ejemplo pista). No existe un buffer y por tanto las transferencias van a ser a menor
velocidad.
Un mismo dispositivo puede ser accedido en cualquiera de los dos modos (esto es lo
habitual en el caso de los discos).
Los mdulos del kernel que gestionan la comunicacin con los dispositivos se llaman
drivers de dispositivos. Lo normal es cada dispositivo tenga su propio driver, pero puede haber
drivers que controlen toda una familia de dispositivos con caractersticas comunes (por ejemplo
los terminales).
En el caso de los ficheros de dispositivos, el inode contiene dos nmeros :
Major number : Indica el tipo dispositivo (disco, cinta...)
Minor number : Indica el nmero de unidad dentro del dispositivo.
Estos nmeros los utiliza el kernel para buscar dentro de unas tablas (block device switch
table y character device switch table) una coleccin de rutinas que permiten manejar el
dispositivo. Estas rutinas son las que constituyen realmente el driver del dispositivo.
Fifo
Es un fichero con una estructura muy similar a un fichero ordinario. La diferencia est en
que los datos de un fifo son transitorios. Una vez que un dato es ledo de un fifo, desaparece de l
y nunca ms podr ser ledo.
Se pueden emplear para comunicar procesos. Los datos de un fifo se leen en el mismo
orden en que fueron escritos (first in - first out). La sincronizacin en el acceso a un fifo es tarea
del kernel.
El almacenamiento de datos en el fifo se realiza de la misma manera que en un fichero
ordinario, solo que el kernel unicamente emplea las entradas directas de la tabla de direcciones de
bloque del inode del fifo. Por lo tanto un fifo podr almacenar 10 kbytes como mucho
(suponiendo bloques de 1024 bytes).
Alberto Navarro Ezquerro Pag
12
Programacin de Sistemas
Los accesos de lectura/escritura se realizan con las mismas llamadas que en los ficheros
ordinarios (open(), close(), read()....), siendo los accesos de tipo atmico con lo que se garantiza
el sincronismo en el caso de que varios procesos accedan concurrentemente al mismo fifo.
Los fifo tambien se denominan tuberas con nombre ya que se comportan como pipes,
tiene asociado un nombre y ocupan una entrada en el directorio y un inode. Mientras que las
tuberas sin nombre slo existen mientras algn proceso est asociado a ellas, no tienen nombre
aunque si ocupan un inode mientras existen.
Las tuberas sin nombre se crean a travs de la llamada pipe() mientras que los fifo se
crean con la orden mknod (desde la lnea de rdenes) o con la llamada mknod() (desde un
proceso).
Permisos en Unix
El uid real determina al propietario de los archivos que manipula. EL uid efectivo
determina al usuario del fichero.
Si el uid efectivo es 0 el permiso se concede automticamente.
Si el uid efectivo del proceso que intenta hacer uso de un archivo y el uid real del
archivo coinciden se le aplican los permisos del propietario.
Si el uid efectivo de grupo coincide con el uid real de grupo coinciden se le aplican
los permisos de grupo.
Si no coinciden ninguno se le aplican los permisos de otros.
13
Programacin de Sistemas
Introduccin
Se denomina sistema de ficheros a la organizacin establecida en disco para el
almacenamiento de los datos, de forma que todos los ficheros de un disco o particin constituyen
un sistema de ficheros. Pero los sistemas de ficheros en Unix presentan una serie de
caractersticas :
Estructura jerquica
No se impone formato a los ficheros
Existencia de los derechos de accesos sobre los ficheros
Tratamiento de los dispositivos perifricos como ficheros
Asignacin dinmica de espacio en disco para los ficheros
Un sistema Unix puede manejar uno o varios discos fsicos, cada uno de los cuales puede
contener uno o varios sistemas de ficheros. Los sistemas de ficheros son particiones lgicas del
disco.
El kernel trata con el sistema de ficheros a un nivel lgico y no trata directamente con los
discos a nivel fsico. Cada disco es considerado como un dispositivo lgico que tiene asociados
unos nmeros, el major number y el minor number, los cuales son empleados para indexar dentro
de una tabla de funciones cual tenemos que emplear para manejar el driver del disco. El driver del
disco es el que transforma direcciones lgicas del sistema de ficheros a direcciones fsicas del
disco.
En SVR4 existen distintos tipos de ficheros :
S5
ufs
nfs
/proc
bfs
fifofs
specfs
Cada uno de estos sistemas contiene un sistema de ficheros de arranque (bfs). Existen
instrucciones para montar cualquiera de estos tipos de sistemas de ficheros excepto los fifofs y los
specfs que no se pueden montar.
14
Programacin de Sistemas
Sistema de ficheros S5
En este sistema de ficheros los discos estn organizados en unidades de acceso llamadas
bloques fsicos. Estos bloques, por lo general ocupan 512 bytes pero para optimizar el acceso a
disco los sistemas de ficheros definen unidades de acceso mayores, es decir, definen bloques
lgicos (ej : 512, 1024, 2048).
La estructura del sistemas de ficheros en Unix System V es :
bloque de boot
superbloque
lista de inodos
bloques de datos
Bloque de arranque
Es el primer bloque de la particin y ocupa 512 bytes (bloque 0). Puede contener
una referencia al programa de arranque. En algunos sistemas el programa de arranque
est ubicado en el sistema de ficheros de arranque (bfs), de manera que este bloque
sigue existiendo pero no es utilizado. La intencin est en independizar el arranque para
que no dependa de un sistema de ficheros en particular.
Superbloque
Segundo bloque de 512 bytes que almacena datos administrativos sobre el sistema
de ficheros tales como : nmero de bloques libres disponibles, lista de bloques libres,
lista de inodos libres.
Lista de inodes
Consiste en una serie de estructuras continuas de 64 bytes y cada una de las se
denomina inodo. Existe un inodo por fichero en el sistema. Esta lista de inodos
comienza en el bloque y su longitud es determinada en el momento de la creacin del
sistema de ficheros.
Bloques de almacenamiento
Comienzan tras el ltimo bloque de la lista de inodos y se extiende hasta el final del
espacio disponible. Estos bloques pueden contener los datos de los ficheros, punteros a
otros bloques del fichero o punteros a bloques libres.
15
Programacin de Sistemas
Descripcin de un inodo
Modo
Nmero de enlaces
Identificador de usuario
Identificador de grupo
Tamao del fichero
Direcciones de bloques
Fecha de acceso
Fecha de modificacin
Fecha de cambio
El Modo hace referencia al tipo de fichero y permisos de acceso y ocupa 2 bytes. El tipo
de fichero es un campo de 4 bits que se asigna cuando se crea el fichero y se incluyen en el campo
modo. Los tipos y los valores asociados son los siguientes :
Tipo
Ordinario
Directorio
Especial-Carcter
Especial-Bloque
Pipe
Enlace simblico
Inodo libre
Valor
1000
0100
0010
0110
0001
1010
0000
Se crea con
open(), creat()
mkdir()
mknod()
mknod()
mknod()
link()
16
Programacin de Sistemas
Directo 0
Directo 1
Directo 2
Directo 3
Directo 4
Directo 5
Directo 6
Directo 7
Directo 8
Directo 9
Indirecto
Simple
Indirecto
Doble
Indirecto
Triple
Superbloque
Siempre, una copia del superbloque de los sistemas de ficheros montados se mantiene en
memoria, fundamentalmente porque la informacin del superbloque se utiliza para la asignacin y
liberacin de inodos y de bloques. Los campos del superbloque son :
17
Programacin de Sistemas
Flag de bloqueo del array de bloques libres. Bloquea dicho array cuando est siendo
modificado.
Flag de bloqueo del array de inodos libres. Con la misma funcin que el anterior.
Flag de modificacin del superbloque. Indica que la versin en memoria del
superbloque ha sido modificada.
Campo de fecha y hora de la ltima modificacin del superbloque.
Flag de slo lectura. Indica si el sistema de ficheros se mont slo para lectura y
cualquier intento de modificacin del sistema de ficheros ser rechazada.
Lista de bloques libres
Durante la creacin de un sistema de ficheros (particin) se genera una lista con todas las
direcciones de todos los bloques lgicos libres. Las direcciones (punteros) de los 50 primeros
bloques libres se sitan en el array de bloques libres del superbloque, que forma el primer nodo de
la lista.
El resto de la direcciones de bloques libres son tambien divididas en grupos de 50. El resto
de los nodos contienen, 50 holding blocks que son punteros a bloques que contienen a su vez 50
punteros a bloques libres.
Asignacin bloques libres
El sistema asigna el siguiente bloque del array de bloques libres siempre que no sea un
holding block. Si el siguiente bloque es un holdong block el sistema coloca los punteros a bloques
libres del holding block en el array de bloques libres.
Liberacin de bloques
Si el array de bloques libres del superbloque no est lleno, le direccin del bloque liberado
se anota en el superbloque incrementndose el ndice del array. Si el array de bloques libres est
lleno, el bloque liberado es usado como holding block.
Lista de inodos libres
Asignacin de inodos : El ltimo ndice de la lista de inodos libres se denomina inodo
recordado de forma que cuando el sistema necesita un nuevo inodo busca en la lista de
inodos libres y si el primero no es el recordado lo asigna. Si se trata del inodo
recordado el sistema busca los siguientes 100 inodos libres empezando a buscar a partir
del inodo recordado y este ser asignado.
Liberacin de inodos : Si el inodo liberado es mayor que el inodo recordado el sistema
no hace nada. Si es menor se sustituye por el inodo liberado.
18
Programacin de Sistemas
Superbloque
Bloque Lista de
de
inodos
grupo
de
cilindros
Bloques de
almacenamiento
.......
Superbloque
Bloque
de
......
grupo de
cilindros
Descripcin de un inodo
Al igual que en SVR4, un inodo define unicamente a un fichero y cada uno tiene 128 bytes
con la siguiente infomacin :
19
Programacin de Sistemas
nmero de inodo
longitud del
nombre
null
Estos chunks estn separados por huecos (gaps) de 4 bytes y el espacio es asignado a los
directorios en grupos de 512 bytes.
Inodos
Bloques de almacenamiento
20
Programacin de Sistemas
Coordinar las llamadas relacionadas con los archivos (write, read, close, open...)
Coordinacin de los archivos abiertos en el sistema mediante tablas
Validacin de los permisos de acceso a los ficheros
Administracin de los ficheros en disco
Mantener la integridad del sistema de ficheros
Manejar distintos tipos de sistemas de ficheros
21
Programacin de Sistemas
Estructuras
User open file table : Existe una tabla de este tipo para cada proceso del sistema. Esta
tabla se almacena en el rea de usuario del proceso (user area) y tiene una entrada por
cada fichero abierto por el proceso. El descriptor del fichero es el lugar que ocupa el
fichero en dicha tabla.
System file structure : El sistema mantiene una estructura de este tipo por cada llamada
a open() que se haya realizado. Guarda informacin de como se abri el fichero y
tambien el offset del fichero que se est leyendo o escribiendo.
Vnode structure : Existe una estrucutra vnode por cada fichero y almacena informacin
referente a los atributos del fichero, pero es informacin independiente del tipo del
sistema de ficheros al que pertenece dicho fichero. Cada vnode tiene un puntero a una
estructura que se denomina vnodeops que son punteros a rutinas dependientes del tipo
de sistema de ficheros.
Virtual file system switch table : Esta tabla tiene una entrada por cada tipo de sistema
de ficheros que existe en el sistema. Cada una de las entradas de la tabla contiene
punteros a estructuras vfsops y esta estructura contiene, a su vez, punteros a rutinas
dependientes del tipo de sistema de ficheros.
Lista de sistemas de ficheros montados : Esta lista es necesaria para administrar los
diferentes sistemas de ficheros montados en el sistema.
Proyeccin en memoria de un fichero abierto
Cada proceso del sistematiene o posee una zona de memoria privada denominada user
area. Uno de los elementos de este rea es un array de los ficheros abiertos por el proceso. Este
array de punteros y cada uno de ellos apunta a un elemento de la tabla de ficheros del sistema
(system file list).
El array de la user area es el que denominamos user open file table cuyos punteros
apuntan a la lista de ficheros abiertos por el sistema denominada system file list y los punteros de
esta ltima son del tipo struct file.
22
Programacin de Sistemas
User Area
Archivos abiertos
df = 0
direccin
df = 1
direccin
struct file
struct file
vnode
vnode
vnode
df = k
direccin
struct file
Cada struct file contiene informacin sobre el fichero al que apunta (nmero de veces
referenciado, punteros a la anterior y siguiente estructura....) y entre esa informacin se encuentra
un puntero a la estructura vnode asociada al fichero. Un vnode es una estructura independiente
del sistema de ficheros que contiene, entre otros, los siguientes datos :
v_count : Contador del nmero de ficheros abiertos que hacen referencia a este
vnode.
v_data :
v_op :
v_vfsp :
#define NFPCHUNK 24
struct ufchunk
{ ......
struct file
*uf_ofile[NFPCHUNK] ;
struct ugchunk
*uf_next ;
};
23
Programacin de Sistemas
Por defecto, cuando un proceso se activa en el sistema se localiza una nica estructura del
tipo ufchunk que ser u_flist. Esta u_flist contiene un array, por lo general, de 24 punteros de tal
forma que si el proceso abriera ms de 24 ficheros se buscara otra estructura ufchunk con otros
24 punteros.
Cuando se realiza la llamada open(), el sistema localiza una nueva struct file de la lista de
ficheros del sistema y retorna su descriptor de fichero. Ese descriptor es el elemento del array
uf_ofile asignado al fichero.
Lista de ficheros del sistema
Cada struct file mantiene informacin acerca de cada fichero abierto en el sistema. La
definicin de esta estructura est en /usr/include/sys/file.h :
typedef struct file
{ struct file
*f_next ;
Puntero al siguiente
struct file
*f_next ;
Puntero al anterior
u_short
f_flag ;
Modo de apertura (O_RDONLY.....)
cnt_t
f_count ;
Nmero de referencias a la estructura
struct vnode
*f_vnode ;
Puntero a la estructura vnode
off_t
t_offset ;
Posicin del ltimo byte leido o escrito
strcut cred
*f_cred ;
Guarda informacin sobre el proceso (id, grupo...)
} file_t ;
Estructura vnode
Almacena informacin administrativa bsica del fichero y cuando se realiza una llamada a
open() se accede al vnode del fichero para obtener ese tipo de informacin. La definicin de esta
estructura se encuentra en /usr/include/sys/vnode.h :
typedef struct vnode
{ u_short
v_flag ;
u_short
v_count ;
struct vfs
*v_vfsmountedhere ;
struct vnodeops *v_op ;
struct vfs
*v_vfsp ;
struct stdata
*v_stream ;
struct page
*v_pages ;
enum vtype
v_type ;
dev_t
v_rdev ;
caddr_t
v_data ;
struct filock
*v_filocks ;
long
v_filler[8] ;
} vnode_t ;
v_flag es un flag que se activa si se trata del vnode de root en un sistema de ficheros.
Alberto Navarro Ezquerro Pag
24
Programacin de Sistemas
25
Programacin de Sistemas
El campo wakeflag se activa si cualquier proceso tiene que pasar a un estado sleep por un
bloqueo. Los procesos durmientes estn en una lista denominada sleep lock list.
Tabla de conmutacin virtual de ficheros (vfs switch table)
La flexibilidad para poder usar distintos tipos de sistemas de ficheros la proporciona el
sistema de ficheros virtual. El sistema mantiene una tabla por cada tipo de sistema de ficheros
presente en el sistema. En esta tabla donde cada una de las entradas es una estructura denominada
struct ufssw que contiene punteros a funciones dependientes del sistema de ficheros para, de esta
forma, manejar el sistema de ficheros en su totalidad.
26
Programacin de Sistemas
{ char
int
struct vfsops
long
} vfssw_t ;
La lista de sistemas de ficheros montados se denomina vfs list y tiene las siguientes
funciones :
Proporciona informacin a las rutinas del sistema para resolver los pathnames de los
ficheros cuando se producen cambios en el dispositivo fsico en el que residen esos
ficheros.
Para localizar los superbloques que utilizarn las subrutinas internas.
Para localizar funciones dependientes del sistema de ficheros.
27
Programacin de Sistemas
Slo lectura
Slo escritura
Lectura y escritura
El fichero es abierto de manera no bloqueante. Ninguna operacin que se
haga sobre el descriptor del fichero provocar espera del proceso que la
llame
Situa el puntero del fichero al final del mismo para aadir datos
Permite sincronizar la intencin de escribir con la operacin fsica.
Actualizacin de buffer a disco inmediata
Si el fichero no existe se crea, de lo contrario se obvia
Apertura exclusiva. Si se usa junto a O_CREAT y el fichero existe, open()
devuelve un -1
Si el fichero existe su longitud ser truncada a 0
Casos especiales :
En un fichero FIFO abierto slo para lectura, si O_NDELAY o O_NONBLOCK
no estn activos y el terminal de escritura no est abierto, la siguiente operacin
de lectura de vuelve -1.
En un fichero FIFO abierto slo para escritura, si O_NDELAY o _NONBLOCK
estn activos y el terminal de lectura no est abierto, la siguiente operacin de
escritura devuelve -1.
28
Programacin de Sistemas
Includes necesarios :
#include <unistd.h>
Devuelve :
0 : ok
1 : Error
int read(int df, void *buffer, unsigned numbytes)
Includes necesarios :
#include <unistd.h>
#include <sys/types.h>
#include <sys/uio.h>
Devuelve :
Nmero de bytes leidos
-1
: ok
: Error
Casos especiales :
Que haya un proceso con un bloqueo imperativo sobre el archivo. Si se abri con
O_NDELAY o O_NONBLOCK entonces read devuelve -1.
Manejo de tuberas vacas. Si intento leer del extremo de lectura de una tubera
cuyo extremo de escritura est cerrado read devuelve 0. Si el terminal de
escritura est abierto y el open usa O_NDELAY read devuelve 0, si el open est
hecho con O_NONBLOCK read devuelve -1 y si ninguno est activo se bloquea.
int write(int df, void *buffer, unsigned numbytes)
Includes necesarios :
#include <unistd.h>
Devuelve :
Nmero de bytes escritos
-1
: ok
: Error
Casos especiales :
Si hay un proceso con un bloqueo imperativo de escritura sobre el archivo y otro
intenta acceder para escribir. Si se abri con O_NDELAY o O_NONBLOCK
entonces write devuelve -1. Si no estn activos se queda bloqueado.
29
Programacin de Sistemas
#include <sys/types.h>
#include <fcntl.h>
Crea el archivo si no existe y lo abre para escritura. Si existe lo abre para escritura y borra
los datos existentes.
int unlink(const char *camino)
Includes necesarios :
#include <unistd.h>
Resta 1 al nmero de enlaces.
off_t lseek(int df, off_t offset, int whence)
Includes necesarios :
#include <unistd.h>
#include <sys/types.h>
Devuelve :
El nuevo offset del puntero de lect/escr
-1
: ok
: Error
30
Programacin de Sistemas
Duplica un descriptor de fichero que ya ha sido asignado y que est ocupando una entrada
en la tabla de descriptores de ficheros. La llamada dup va a recorrer la tabla de descriptores y va a
marcar como ocupada la primera entrada que encuentre libre, pasando a devolvernos el descriptor
asociado a esa entrada.
int ustat(dev_t dev, struct ustat *buf)
Includes necesarios :
#include <sys/types.h>
#include <ustat.h>
La informacin administrativa y estadstica de un sistema de ficheros se encuentra en su
superbloque. Para acceder a los aspectos ms relevantes de esta informacin se usa ustat que los
devuelve en la estructura apuntada por buf. Dev es el nmero de dispositivo de la seccin del
disco donde se encuentra el sistema de ficheros. La estructura ustat se define :
struct ustat
{
daddr_t
ino_t
char
char
};
f_tfree ;
f_tinode ;
f_fname[6] ;
f_fpack[6] ;
void sync()
Includes necesarios :
#include <unistd.h>
Produce una sincronizacin entre el buffer cach y el disco, forzando as la consistencia del
sistema. Actualiza tambin el superbloque y los inodos que hayan sufrido modificacin.
void fsync()
Igual que la anterior pero no devuelve el control al programa hasta la consolidacin se
realice.
int mount(const char *particin, cons char *dir, int mflag, int fstype, cons char *datos,
size_t datoslen)
Particin
Dir
Mflag
Fstype
Datos
31
Programacin de Sistemas
Datoslen
GETFSTYPE
GETNFSTYPE
32
Programacin de Sistemas
F_OK
: Existencia
Se deniega cuando :
El usuario efectivo no tenga permiso de ejecucin de alguno de los directorios. La
variable errno se carga con el valor EACCESS.
El modo del archivo no lo permite (errno = EACCESS).
Cuando en el camino especificado hay demasiados enlaces simblicos
= ELOOP ? ?).
(errno
Que alguno de los nombres del camino no sea un directorio (errno = ENOTDIR).
El fichero no existe (errno = ENOENT ? ?).
El archivo especificado por la ruta ...ENOLINK ? ? ?
Cuando el archivo est embebido en un sistema de archivos de slo lectura y
preguntas para escribir (errno = EROFS).
int chmod(const char *camino, mode_t modo)
int fchmod(int fd, mode_t modo)
Includes necesarios :
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
Cambia el modo.
33
Programacin de Sistemas
Includes necesarios :
#include <sys/types.h>
#include <sys/stat.h>
Suministra informacin que se almacena en la tabla de inodes sobre el estado de un fichero
concreto. Informacin :
mode_t
ino_t
dev_t
dev_t
st_modo
st_ino
st_dev
st_rdev
: Modo de un archivo.
: Nmero del nodo de ndices del archivo
: Nmero del dispositivo que contiene al inode.
: Si es un archivo especial este campo tendr el major y el
minor del archivo especial.
nlink_t
st_nlink
: Nmero de enlaces.
uid_t
st_uid
: Uid del propietario real.
gid_t
st_gid
: Grupo del propietario.
off_t
st_size
: Tamao del archivo en bytes.
time_t
st_atime
: Fecha del ltimo acceso al fichero.
time_t
st_mtime
: Fecha de la ltima modificacin del fichero.
time_t
st_ctime
: Fecha de la ltima modifcacin administrativa.
longst_blksize
: Tamao del bloque del sistema de archivos.
longst_blocks
: Nmero de bloques.
34
Programacin de Sistemas
F_GETFL : Devuelve los flags de estado y modo de acceso del fichero referido
Alberto Navarro Ezquerro Pag
35
Programacin de Sistemas
Tipo de cerrojo :
F_RDLCK : Lectura
F_WRLCK : Escritura
F_UNLCK : Eliminar el cerrojo
short l_whence
off_t l_start
off_t l_leng
pid_t l_pid
long l_sysid
Los cerrojos fijados por un proceso sobre un fichero se borran cuando el proceso termina.
Adems, los cerrojos no son heredados por los procesos hijos tras la llamada a fork.
36
Programacin de Sistemas
37
Programacin de Sistemas
TEMA 6 : PROCESOS
Estructura de un proceso
Un proceso consta de los siguientes segmentos :
TEXT
DATA
BSS
STACK
USER AREA
TEXT :
DATA :
BSS :
STACK :
TEXT
Rutina trap.c
trap.s
Cdigo
Subsistema de
ficheros
Cdigo
Subsistema de
procesos
Cdigo
Subsistema E/S
Cdigo de
drivers
ESTRUCTURAS
DATA
DEL
USER AREA
proceso en
ejecucin
STACK
KERNEL
Stack del
sistema
38
Programacin de Sistemas
39
Programacin de Sistemas
{
char
int
struct cred
struct proc
struct as
k_sigset
struct vnode
pte_t
} proc_t ;
Estados de un proceso
Alberto Navarro Ezquerro Pag
40
Programacin de Sistemas
ejecutndose en
modo usuario
retorno al
modo usuario
1
zombi
llamada al sistema
o interrupcin
durmiendo
en memoria
dormir
retorno
cambio de
contexto
exit
ejecutndose en modo kernel
ejecucin
de otro
proceso
interrupcin
retorno de
una interrupcin
listo para ejecutarse
en memoria
despertar
swap out
swap out
durmiendo
en memoria
secundaria
swap in
despertar
hay suficiente
memoria
creado
no hay suficiente
memoria
41
fork
Programacin de Sistemas
De manera que todas aquellas llamadas que no exportan el entorno de trabajo de manera
automtica finalizan con la letra e (execle, execve....) y aquellas que realizan una bsqueda
automtica por el PATH finalizan con la letra p (execlp, execvp....).
Las funciones son (<unistd.h>) :
int execv (const char *path, const char *argv[])
Ejecuta el programa indicado por path como un nuevo proceso. El parmetro
argv[] es un array de cadenas terminadas en 0 que se usa para dar valor al
parmetro argv de la funcin main() del programa que se va a ejecutar. El ltimo
elemento de este array debe ser un puntero nulo. Por convencin el primer
elemento de argv es el nombre del fichero. El entorno se exporta automticamente
tomndolo de la variable environ del proceso actual. No se realiza bsqueda
automtica por el path, por lo que habr que especificar el nombre completo del
fichero a ejecutar.
int execl (const char *path, const char *arg0,........, const char *argn)
Igual que execv slo que las cadenas de argv se especifican individualmente. El
ltimo de los argumentos debe ser un puntero nulo.
int execve (const char *path, const char *argv[], const char *env[])
Igual que execv slo que el entorno no se exporta automticamente y se puede
especificar explcitamente en el parmetro env[]. Es un array de cadenas con la
misma forma que la variable environ (nombre=valor).
int execle (const char *path, const char *arg0,...,const char *argn,const char *env[])
Similar a execl pero permite especificar el entorno para el nuevo proceso
explcitamente.
int execvp (const char *fich, const char *argv[])
Igual que execv slo que realiza la bsqueda automtica por le PATH.
int execlp (const char *fich, const char *arg0,....., const char argn)
Similar a execl con la excepcin de que se realiza una bsqueda automtica por el
PATH. El entorno se exporta automticamente.
El programa llamado con exec heredar el user rea del proceso que realiza la llamada por
lo tanto recibir : el PID, PGID y TGID (terminal group id).
Llamada fork()
Permite generar un nuevo proceso o proceso hijo es una copia exacta del proceso padre. El
formato de la llamada fork() es :
#include <sys/types.h>
#include <unistd.h>
Alberto Navarro Ezquerro Pag
42
Programacin de Sistemas
pid_t fork()
Si la llamada tiene xito habr dos procesos, el padre y el hijo, que vern el retorno de la
llamada pero con un valor diferente para cada uno de ellos. Retornar 0 para el proceso hijo y el
identificador del proceso hijo para el padre. Si se produce un error retornar -1 al padre.
El proceso hijo hereda :
Llamada exit
Un proceso puede terminar su ejecucin mediante una llamada a exit() o al recibir una seal
o al finalizar su funcin main(). El formato de exit() es el siguiente :
#include <stdlib.h>
void exit (int status)
Finaliza el proceso liberando los recursos que estaba utilizando : libera reas de memoria,
cierra los ficheros y se autoelimina de la tabla de procesos. El valor de status es pasado a la
llamada wait() del proceso padre y los valores pueden ser :
0
1-255
Todo es correcto
Indican cdigos de error definidos por el usuario
43
Programacin de Sistemas
: Indica que hay que esperar por el proceso cuyo pid coincida con el valor
de id
P_GID : Espera por todos los procesos del grupo id
P_ALL : Espera por todos los procesos del grupo
En *infop se encuentra el estado del proceso hijo. La estructura siginfo_t tiene los
siguientes campos :
int si_signo
int si_errno
int si_code
: Nmero de seal
: Nmero de error
: Informacin sobre el motivo de la seal
Indica que hay que esperar que el proceso o los procesos terminen
Hay que esperar que el proceso o los procesos sean detenidos y
devolver en infop informacin sobre la seal
El proceso debe retornar inmediatamente, no tiene que pasar a
sleep
Para obtener informacin sobre el proceso hijo en infop sin liberar
la estructura de proceso de ese proceso.
Alberto Navarro Ezquerro Pag
44
Programacin de Sistemas
45
Programacin de Sistemas
TEMA 7 : SEALES
Introduccin
Una seal es un mensaje de un proceso a otro con relacin de parentesco. Estas seales
software se envan en un instante determinado pero el proceso no sabe cuando le llega, ni quien se
la enva, pero si sabe que interrupcin le llega.
t0
t1
t2
Seal
Seal
Seal
Kernel
Proceso
usuario
s0
Puede
ignorarla
tj
s1
Rutina de
tratamiento
s2
tk
Fin
Fin
Tratamiento
por defecto
core
Fin
Fin
46
Programacin de Sistemas
SIGQUIT
SIGTERM
SIGHUP
SIGKILL
SIGUSR1
SIGALRM
Control de procesos
SIGSTOP
SIGCONT
SIGCLD
Control de recursos
SIGXCPU
SIGXFSZ
47
Programacin de Sistemas
: u_signal[i] = = SIG_DFL
: u_signal[i] = = SIG_IGN
: u_signal[i] = = handler (direccin de la funcin a ejecutar)
48
Programacin de Sistemas
Si todo va bien devuelve 0, en caso de error -1. Esta funcin es de SVR4 y necesita los
includes <sys/types.h> y <sys/signal.h> y <sys/procset.h>.
int kill (pid_t pid, int sig)
Permite enviar la seal especificada en sig al proceso o grupo de procesos especificado
en pid. Significado de los valores de pid :
Si el pid es positivo considera que es un pid vlido para enviarle la seal
Si el pid = 0 la seal se enva a todos los que son del grupo del emisor
Si el pid = -1 y el proceso emisor es root se enviar a todos los procesos del
sistema menos el 0 y el 1.
Si el pid = -1 y el proceso emisor no es root se enva a todos los procesos con
el mismo identificador de usuario efectivo.
Si pid != -1 se enva a todos los procesos cuyo identificativo de grupo sea el
valor absoluto de pid.
El valor de retorno es 0 si la seal se envo satisfactoriamente, en caso contrario no se
enva ninguna seal y retorna -1. Esta funcin es de SVR3 y necesita los includes
<sys/types.h> y <signal.h>.
49
Programacin de Sistemas
Alarmas
Es un estado de cuenta atrs, pasado el cual el procedimiento que la instalado recibe una
interrupcin.
50
Programacin de Sistemas
valor = setjmp(entorno);
valor = 0
valor = 10
longjmp(entorno,10);
51
Programacin de Sistemas
El proceso en ejecucin realiza una llamada a una rutina del kernel denominada switch o
pswitch que son las responsables de realizar el switching out del propio proceso.
Un proceso en ejecucin tiene su user rea mapeada dentro del espacio de direccionamiento
del kernel y la localizacin fsica de ese user rea no cambia, sino que pasa a formar parte del
espacio virtual del kernel.
Cada proceso tiene asignado una rodaja de tiempo time slice para su ejecucin. Este
tiempo depende del nivel de prioridad y de la clase a la que pertenece (tiempo real o tiempo
compartido).
52
Programacin de Sistemas
kprunrun
srunprocs
dispq[]
dispq[79]
maxrunpri
dqactmap
t1
tw
t2
t w+1
Colas de prioridades
53
Programacin de Sistemas
dispq[ ]
+
M
Cada ndice apunta a una lista enlazada con todos las tareas con esa prioridad. El
planificador de tareas busca de mayor a menor prioridad. En la parte de tiempo real normalmente
hay tareas del sistema y no es aconsejable meter tareas de usuario.
El proceso 0 job scheduler maneja el algoritmo de bsqueda.
Nivel independiente de la clase
Cada clase de prioridad define sus propios algoritmos de asignacin de CPU. Estos
algoritmos estn implementados en las llamadas funciones dependientes de la clase (cada proceso
hereda la prioridad del proceso padre). Un proceso puede modificar su prioridad mediante la
llamada priocntl().
Cada clase de prioridad tiene una entrada en la tabla class[] definida en <sys/class.h>. Cada
elemento de esta tabla es una estructura con el siguiente formato :
typedef struct class
{ char
char
struct classfuncs
} class_t ;
*cl_name ;
(*ct_init)() ;
*cl_funcs ;
54
Programacin de Sistemas
} classfuncs_t ;
Funciones dependientes de la clase
cl_enterclass()
Funcin empleada para situar un proceso en una clase de prioridad determinada.
cl_exitclass()
Saca a un proceso de una clase de prioridad
cl_tick
Es invocada desde clock() y es la responsable de chequear si el proceso en ejecucin
ha consumido el tiempo asignado, y si es asi se encarga de activar el flag runrun para
activar otro proceso.
cl_sleep()
Se ocupa de pasar un proceso a estado de sleep.
cl_wakeup
Responsable de despertar al proceso que estaba dormido y de pasarlo a dispq.
cl_fork y cl_forknet
Son invocadas desde fork() cuando se genera un nuevo proceso en el sistema. La
primera inicializa una nueva estructura especfica de la clase para el proceso hijo
generado. La segunda es invocada por el proceso padre antes de volver a modo usuario
y se encarga de decidir que proceso retornar antes a modo usuario (en la mayora de
los casos es el proceso hijo).
cl_trapret
Es invocada al retornar de una llamada o trap y es la encargada de ajustar la prioridad
de los procesos.
Clase de tiempo compartido
Un proceso pertenece generalmente a esta clase a no ser que se emplee la llamada al sistema
priocntl() para asignarle una nueva clase de prioridad. El rango de prioridades por defecto va de 0
a 99. Cada proceso tiene asignada una estructura de datos dependiente de la clase.
La prioridad se obtiene a partir de una operacin con dos operandos : uno proporcionado
por el kernel y el otro por el usuario. La porcin del kernel permite calcular el uso de CPU en
funcin de la prioridad del proceso ; si un proceso emplea la CPU la porcin del kernel disminuye,
es decir el proceso tendr menos posibilidades de ser seleccionado por pswitch(). Si un proceso
no emplea la CPU durante un determinado intervalo la porcin del kernel aumenta incrementando
las posibilidades del proceso de ser seleccionado. La porcin de usuario puede ser especificada
con priocntl() siempre que se tengan privilegios de superusuario.
Alberto Navarro Ezquerro Pag
55
Programacin de Sistemas
56
Programacin de Sistemas
rt_pri
rt_flags
rt_procp
rt_pstat
rt_pprip
rt_next
rt_prev
Prioridad
Puede tomar los siguientes valores :
RTRAN
: El proceso se ha ejecutado en el ltimo swap out
RTBACKQ : Situar al proceso al final de la cola
Puntero a la estructura del proceso
Puntero al campo de estado p_stat de la estructura del proceso
Puntero al campo de estado p_pri de la estructura del proceso
Puntero a la estructura siguiente
Puntero a la estructura anterior
SONPROC
SSLEEP
Estados de un proceso :
57
Programacin de Sistemas
SZOMB
NULL
exit()
sleep
SONPROC
pswitch()
preempt()
SSLEEP
wakeprocs()
SRUN
fork
58
Programacin de Sistemas
Si
No
Existe la clave key_t ?
Si
errno = ENOSPC
Si
No
No
errno = ENOENT
Si
Estn activados
IPC_CREAT e IPC_EXCL ?
Si
errno = EEXIST
No
Permisos correctos ?
No
errno = EACCESS
Si
Devolver id
59
Programacin de Sistemas
Todo mecanismo est definido por un descriptor. Con rdenes del tipo xxxget se crean
los mecanismos.
descriptor xxxget (clave, permisos)
Si ya est creado el mecanismo te devuelve su descriptor con lo cual te conectas a l.
Dentro de los parmetros de esta llamada se incluye una clave o llave y una mscara de
flags. El kernel busca algn mecanismo ya creado con esa clave. Si la llave toma el valor
IPC_PRIVATE me asegura la privacidad de la clave y que ninguna otra llamada a
xxxget va a poder devolver esa entrada.
Si dentro de la mscara de flags est activo el bit IPC_CREAT, el kernel crea una nueva
entrada en caso de que no haya ninguna que responda a la clave suministrada. Si, adems
de IPC_CREAT, est activo el bit IPC_EXCL, el kernel devuelve un error en caso de
que exista una entrada para la clave suministrada.
Primitivas :
Includes
Creacin o Apertura
Opr. de Control
Opr. de Comunicacin
Colas de Mensajes
sys/msg.h
msgget
msgctl
msgsnd msgrcv
Semforos
sys/sem.h
semget
semctl
semop
Memoria Compartida
sys/shm.h
shmget
shmctl
shmat shmdt
Formacin de claves
Una clave es una variable o constante del tipo key_t que vamos a usar para acceder a los
mecanismos IPC previamente creados o para crear otros nuevos. Hay mltiples formas de crear
claves, una de ellas es mediante la siguiente funcin :
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok (char *camino, int idproyecto)
Ftok devuelve una clave basada en el camino de un fichero y en un id que identifica el
proyecto.
Control de los mecanismos IPC desde la lnea de rdenes
Para ello existen dos rdenes :
$ ipcs [ opciones ]
60
Programacin de Sistemas
sem_perm ;
*sem_base ;
sem_nsems ;
sem_otime ;
sem_pad1 ;
sem_ctime ;
sem_pad2 ;
sem_pad3[4] ;
Estructura de permisos
Puntero al primer semforo
Nmero de semforos en el racimo
Hora de la ltima opr. realizada sobre el semforo
Vaco.
Hora de la ltima modificacin
Vaco
Vaco
struct sem
{ ushort
pid_t
ushort
ushort
}
semval ;
sempid ;
semncnt ;
semzcnt ;
61
Programacin de Sistemas
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
62
Programacin de Sistemas
int semctl (int semid, int semnum, int orden, union semun arg)
Permite acceder a informacin administrativa y de control sobre un semforo o un conjunto
de ellos. Semid es el identificador de un grupo de semforos obtenido con una llamada semget().
Sennum es el nmero del semforo del conjunto al que queremos acceder. Orden es la operacin
de control a realizar sobre el semforo, sus posibles valores son :
No necesitan permisos :
GETVAL
SETVAL
GETPID
val ;
*buf ;
Colas de mensajes
63
Programacin de Sistemas
Una cola es una estructura de datos gestionada por el kernel, donde vana poder leer y/o
escribir varios procesos de forma sincronizada. Al contrario que con las tuberas, no es necesario
que exista un proceso en espera de leer los datos para que otro pueda enviar un mensaje a la cola.
Tiene ventajas respecto a las listas enlazadas ya que las operaciones de creacin son atmicas y
las colas de mensajes son heterogneas. Los mensajes no se pueden leer dos veces. Para cada cola
de mensajes el kernel mantiene la siguiente estructura :
struct msqid_ds
{ struct ipc_perm
struct msg
struct msg
ulong
ulong
}
msg_perm ;
*msg_first ;
*msg_last ;
msg_cbytes ;
msg_qbytes ;
struct msg
{ struct msg
long
ushort
ushort
}
64
Programacin de Sistemas
Permite leer y modificar la informacin estadstica de una cola de mensajes. Cmd es el tipo
de operacin, sus posibles valores son :
IPC_STAT
IPC_SET
IPC_RMID
int msgsnd (int msqid, struct msgbuf *msgp, int msgsz, int msgflg)
int msgrcv (int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg)
Permiten enviar y recibir mensajes de una cola determinada. El proceso deber tener
permiso de lectura o escritura en dicha cola. En ambas msqid es el identificador de la cola, msgp
apunta al buffer de datos definido por el usuario que vamos a enviar o revibir. El primer campo de
dicho buffer debe ser de tipo long e identifica el tipo del mensaje. Msgz es el tamao en bytes del
mensaje, donde no se incluye el campo tipo.
Msgtyp slo aparece en la llamada de lectura y especifica el tipo de mensaje que queremos
leer. Puede tomar los siguientes valores :
msgtyp = 0 Lee el primer mensaje que haya en la cola
msgtyp < 0 Lee el primer mensaje cuyo tipo es menor o igual que el valor absoluto de
msgtyp y a la vez sea el ms pequeo de los que hay.
msgtyp > 0 Lee el primer mensaje de tipo msgtyp.
Msgflg es un mapa de bits y tiene distintos significados segn aparezca en la llamada de
lectura o de escritura. En la llamada de lectura :
Si msgflg es 0 el proceso permanecer bloqueado hasta que se enve el mensaje (si la
cola est llena), mientras que si toma el valor IPC_NOWAIT el proceso no esperar
y la funcin retornar -1.
En la llamada de escritura :
Si en la cola no hay ningn mensaje del tipo msgtyp y est activo el flag
IPC_NOWAIT la funcin retorna inmediatamente con el valor -1. Si este flag no
est activo el proceso suspende su ejecucin en espera de que haya un mensaje del
tipo deseado.
Si se activa el flag MSG_NOERROR y el mensaje es ms largo que msgsz lo trunca y
no retorna error.
Si se ejecutan bien, msgsnd() retorna 0 y msgrcv() el total de bytes que realmente ha escrito
en el buffer msgp. Si las llamadas fallan, retornan -1.
El formato de struct msgbuf es :
struct msgbuf
Alberto Navarro Ezquerro Pag
65
Programacin de Sistemas
{ long mtype ;
char mtext[x] ;
}
shm_perm ;
shm_segsz ;
*shm_amp ;
shm_lkcnt ;
shm_lpid ;
shm_cpid ;
shm_nattch ;
shm_atime ;
shm_dtime ;
shm_ctime ;
66
Programacin de Sistemas
67
Programacin de Sistemas
SHM_RDONLY : La memoria ser slo accesible para leer. Por defecto el segmento se
conecta para lec/esc (dando valor 0 al parmetro)
68