|
La interfase entre los programas de usuario y el sistema operativo se define mediante un conjunto de "instrucciones ampliadas" o llamadas al sistema. 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);
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.
|