La interfase entre los programas de usuario y el sistema operativo se define mediante un conjunto de "instrucciones ampliadas" o llamadas al sistema.

wpe1.jpg (14890 bytes)

El conjunto de llamadas que ofrece MINIX, son muy parecidas a las de UNIX y XENIX, si bien estos tienen más.

Existe unas librerías de procedimientos en /usr/lib/ para poder realizar llamadas desde un programa escrito en C.

Ejemplo:        count = read(file, buffer, nbyte);

read -> nombre de la llamada al sistema
file -> fichero de donde leer
buffer -> zona de memoria donde colocar los dato
nbytes -> nº de bytes a leer
count -> nº de bytes leídos, si count es - 1, hay error, que se coloca en la variable global errno

Los programas deben siempre testear después de una llamada si es correcta. MINIX tiene un total de 53 llamadas al sistema, idénticas a UNIX V7 (estándar POSIX). en nombre, función y parámetros.

Ejemplo de programa, del uso de la variable global errno y del procedimiento perror()

 

/*

* errores.c

* lista los errores de llamadas al sistema

*/

# include <stdio.h>

main(argc,argv)

int argc;

char *argv[];

{

int i;

extern int errno;

for (i=0;i<=53;i++){

fprintf(stderr,"%3d",i);

errno=i;

perror(" ");

}

exit(0);

}

Manejo de procesos

pid = fork() - crea un proceso hijo idéntico al proceso padre.

pid = waitpid(pid, &statloc, opts) - espera a que un hijo determinado termine y coge su condición de salida.

s = wait(&status) - espera a que un proceso hijo termine y coge su condición de salida devuelve el pid del hijo que termina, llamada antigua.

s = execve (name, argv, envp) - sustituye la imagen en memoria de un proceso.

exit(status) - pone fin a la ejecución del proceso y devuelve la condición de salida.

size = brk (addr) - fija el tamaño del segmento de datos a (addr).

pid = getpid() - devuelve el id del proceso solicitante.

pid = getpgrp() - devuelve el id de grupo de procesos del proceso solicitante.

pid = setsid() - crea una nueva sesión y asigna el pid del invocador como identificador del grupo de procesos.

s = ptrace(req, pid, addr, data) - controla un proceso para depurar.

Señales

s = sigaction(sig, &act, &oldact) - define la acción a realizar cuando se recibe una señal.

s = sigreturn(&context) - regresa de una señal.

s = sigprocmask(how, &set, &old) - examina o cambia la mascara de las señales.

s = sigpending(set) - obtiene el conjunto de señales bloqueadas.

s = sigsuspend(sigmask) - sustituye la mascara de señales y suspende el proceso.

s = kill (pid, sig) - envía una señal a un proceso.

residual = alarm(seconds) - planifica o programa una señal SIGALRM después de un cierto tiempo.

s = pause() - suspende el solicitante hasta la siguiente señal.

Manejo de ficheros

fd =creat (name, mode) - crea un nuevo fichero o trunca uno existente.

fd = mknod (name, mode, addr) - crea un nodo i normal, especial, o de directorio.

fd = open (file, how, ...) - abre un fichero para lectura, escritura o ambos.

s = close (fd) - cierra un fichero abierto.

n = read (fd, buffer, nbytes) - lee datos de un fichero y los coloca en un buffer.

n = write (fd, buffer, nbytes) - escribe datos a un fichero desde un buffer.

pos = lseek (fd, offset, whence) - mueve el apuntador del fichero.

s = stat (name, &buf) - lee y devuelve el estado de un fichero de su nodo i.

s = fstat (fd, buf) - lee y devuelve el estado de un fichero a partir de su nodo i.

fd = dup (fd) - asigna otro descriptor de fichero para un fichero abierto.

s = pipe (&fd [0]) - crea una tubería.

s = ioctl(fd, request, argp) - realiza operaciones especiales en ficheros especiales.

s = access(name,amode) - verifica los accesos a un fichero.

s = rename(old, new) - cambia el nombre de un fichero.

s = fcntl(fd, cmd, ...) - bloqueo de un fichero y otras operaciones.

Manejo del directorio y del sistema de ficheros

s = mkdir(name, mode) - crea un nuevo directorio.

s = rmdir(name) - elimina un directorio vacio.

s = link (name1, name2) - crea una entrada nueva name2 en el directorio, que apunta al fichero name1.

s = unlink (name) - elimina una entrada del directorio.

s = mount (special, name, rwflag) - monta un sistema de ficheros.

s = unmount (special) - desmonta un sistema de ficheros.

s = sync() - escribe todos los bloques de la memoria cache en el disco.

s = chdir (dirname) - cambia el directorio de trabajo.

s = chroot (dirname) - cambia al directorio raíz.

Protección

s = chmod (name, mode) - cambia los bits de protección asociados con un fichero.

iud = getuid() - determina el uid del solicitante.

gid = getgid() - determina el gid del solicitante.

s = setuid(uid) - fija el uid del solicitante.

s = setgid(gid) - fija el gid del solicitante.

s = chown (name, owner, group) - cambia el propietario y grupo de un fichero.

oldmask = umask (complmode) - pone una máscara que se utiliza para fijar los bits de protección.

Manejo de tiempo

seconds = time (&seconds) - calcula el tiempo transcurrido en segundos desde el 1 de enero de 1970.

s = stime (tp) - pone el tiempo transcurrido desde el 1 de enero 1970.

s = utime (file, timep) - pone la hora del "último acceso" del fichero.

s = times (buffer) - determina los tiempos del usuario y del sistema gastados hasta ahora.