Llamada al sistema, Kernel 3.11.8 de Linux
8. Invocación de la llamada al sistema
TEXTO
Raúl
11/3/20131 min read
Invocación con un programa en lenguaje C
Para comprobar que el nuevo kernel ya tiene implementada la llamada al sistema que se creó desde un inicio, puede probarse este código:
prueba.c
#include <linux/unistd.h> #include <stdio.h> #include <sys/syscall.h> #include <errno.h> int main(){ int aux ; printf("\n\n ---------- Ejemplo de llamada al kernel especial ---------- \n") ; aux = syscall(351) ; printf(" > Retorno de la llamada: = %d , ErrNo = %d " , aux , errno ) ; printf("\n----------\n") ; printf("\nNOTA: El programa despliega ''Llamada: 2013 y ErrNo: 0'' si se implemento la llamada al sistema al Kernel, de lo contrario despliega ''Llamada: -1'' con su ErrNo, indicando que el actual Kernel no tiene implementada la llamada a sistema '351'...") ; printf("\n\n Por: Raul Garcia Cortes \n\n\n") ; }
Hay que observar que usa la primitiva de la libc syscall, la cual se encarga hacer la llamada al sistema con el código que se le pasa de parámetro (en este caso 351, la llamada que se implementó, que retornará el número 2013 cuando se mande a llamar).
Para compilar el programa, se usan los siguientes comandos:
gcc prueba.c -o Prueba
Si todo salió bien, al compilar este programa y ejecutarlo, deberá dar el siguiente resultado:
./Prueba ---------- Ejemplo de llamada al kernel especial ---------- > Retorno de la llamada: = 2013 , ErrNo = 0
lo que indica que la llamada está funcionando y haciendo lo que debe .
Si se compila y ejecuta el mismo programa en un kernel que no tiene implementada esta llamada a sistema, o se cambia el número 351 por otro, la salida será semejante a:
./Prueba ---------- Ejemplo de llamada al kernel especial ---------- > Retorno de la llamada: = -1 , ErrNo = 38
./Prueba ---------- Ejemplo de llamada al kernel especial ---------- > Retorno de la llamada: = -1 , ErrNo = 22
Invocación correcta:
Invocación incorrecta:
en donde syscall retornó -1, y errno tiene el valor 38 u otro número, que significa function not implemented (función no implementada) u otro error semejante.