Llamadas al sistema y Señales en Linux

Llamadas al Sistema [1]

Las llamadas al sistema son puntos de entrada al núcleo (kernel) de Linux. Éstas usualmente no son invocadas de forma directa, sino que se utilizan funciones wrapper de la librería del lenguaje C, glibc, para que estas hagan una serie de pasos necesarios para que la llamada sea exitosa [2]. Estos wrappers normalmente tienen el mismo nombre de la función original y el trabajo que hacen es mínimo la mayoría de las veces.
Cuando una llamada al sistema falla retorna un número de error negativo, pero la función de C retorna -1 y le asigna este número de error negado (positivo) a la variable errno (errno.h).
Aunque no es el caso común, algunas de las llamadas al sistema no tienen una función equivalente proveída por la librería de C, así que hay que llamarlas directamente mediante la función syscall [3] (sys/syscall.h).


Control de Señales [4]

Las señales son utilizadas para notificar a un proceso o hilo acerca de un evento dado y son comúnmente comparadas con las interrupciones de hardware, ya que cuando un proceso recibe una señal puede que se ejecute un manejador de señal, que es equivalente al sistema ejecutando un manejador de interrupcion tras recibir una.
Una señal puede originarse desde excepciones por hardware, llamadas al sistema, eventos gestionados por el núcleo (alarmas), etc.
Cada señal tiene un nombre único, una abreviacion que comienza por SIG (como SIGINT para la señal de interrupción) y un número de señal. Adicionalmente el sistema define cuatro posibles disposiciones o acciones a tomar cuando se recibe una señal :
  • Exit (salir): fuerza al proceso a terminar.
  • Core (núcleo): fuerza al proceso a terminar y a crear un archivo de núcleo (core file).
  • Stop (parar): para el proceso.
  • Ignore (ignorar): ignora la señal; no se toma ninguna acción.
Dentro de un proceso y sus hilos cada señal tiene el mismo manejador de señal, el cual puede ser cambiado a uno diferente del que la señal tiene por defecto (excepto por SIGKILL y SIGSTOP). Un proceso además puede capturar una señal y ejecutar una rutina de manejo de señal propia.
Aqui se puede observar la lista de señales utilizadas [5] .

Control de Procesos [6]

En este tópico parece no haber mucho que decir; existe una serie de herramientas para administrar los procesos, algunas de las cuales se valen de señales para cumplir con su objetivo.

KILL: es la función y llamada al sistema que envía una señal a un proceso determinado por parámetro. Su prototipado:

Ejemplo [7]

int kill(pid_t pid, int sig); 
pid < 0: se envía la señal sig al proceso identificado por pid 
pid = -1:se envía la señal sig a todos los procesos menos al primero (el programa init) 
pid < -1: se envía la señal sig al grupo de procesos identificado por el valor de -pid
Esta función ejemplifica parte del proceso que une los tres temas tratados anteriormente ya que se trata de una Llamada al Sistema con la que se controlan los procesos mediante una señal especificada (como pueden ser SIGSTOP, SIGCONT, SIGTERM; cada una con resultados diferentes).

0 comentarios:

Publicar un comentario

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Best WordPress Themes