\author {Sven Goldt}
\title {Guía Linux de Programación}
\chapter {Llamadas al sistema}

Una llamada al sistema es normalmente una demanda al sistema operativo
(nucleo) para que haga una operación de hardware/sistema específica o
privilegiada. Por ejemplo, en Linux-1.2, se han definido 140 llamadas
al sistema. Las llamadas al sistema como close() se implementan en la
libc de Linux. Esta aplicación a menudo implica la llamada a una macro
que puede llamar a syscall(). Los parámetros pasados a syscall()
son el número de la llamada al sistema seguida por el argumento
necesario. Los números de llamadas al sistema se pueden encontrar en $<
linux/unistd.h >$ mientras que $< sys/syscall.h >$ actualiza con una
nueva libc. Si aparecen nuevas llamadas que no tienen una referencia
en libc aun, puede usar syscall(). Como ejemplo, puede cerrar un
fichero usando syscall() de la siguiente forma (no aconsejable):

\begin{verbatim}
#include <syscall.h>

extern int syscall(int, ...);

int my_close(int filedescriptor)
{
   return syscall(SYS_close, filedescriptor);
}
\end{verbatim}

En la arquitectura i386, las llamadas al sistema están limitadas a 5
argumentos además del número de llamada al sistema debido al número de
registros del procesador. Si usa Linux en otra arquitectura puede
comprobar el contenido de $< asm/unistd.h >$ para las macros \_syscall,
para ver cuántos argumentos admite su hardware o cuantos escogieron
los desarrolladores. Estas macros \_syscall se pueden usar en lugar de
syscall(), pero esto no se recomienda ya que esa macro se expande a
una función que ya puede existir en una biblioteca. Por consiguiente,
sólo los desarrolladores del núcleo deberían jugar a con las macros
\_syscall. Como demostración, aquí tenemos el ejemplo de close() usando
una macro \_syscall. 

\begin{verbatim}
#include <linux/unistd.h>

_syscall1(int, close, int, filedescriptor);
\end{verbatim}
La macro \_syscall1 expande la función close(). Así tenemos close() dos
veces, una vez en libc y otra vez en nuestro programa. El valor
devuelto por syscall() o un una macro \_syscall es -1 si la llamada al
sistema falló y 0 en caso de éxito. Déle un vistazo a la variable
global errno para comprobar que ha ocurrido si la llamada al sistama falló. 

Las siguiente llamadas al sistema están disponibles en BSD y SYS V
pero no están disponibles en Linux: \\ audit(), auditon(), auditsvc(),
fchroot(), getauid(), getdents(), getmsg(), mincore(), poll(),
putmsg(), setaudit(), setauid().

\endinput
