martes, 16 de agosto de 2011

SEÑALES

Una señal es una interrupción de software. Es generado por el sistema operativo en respuesta a algún evento que se ha producido en el código o relacionado con el código. No le dicen al sistema operativo qué hacer cuando se produce una señal, no hay una acción predeterminada, se espera q el sistema operativo modifique su ejecución normal cuando se le manda una señal a un proceso, siempre que se  haya establecido anteriormente un procedimiento para tratar esa señal, este se ejecutara y si no se  estableció nada previamente se ejecuta la acción por defecto para esa señal. Por lo general, se usa para abortar el programa.

Una de las razones para hablar de las señales se debe a la forma en que trabaja  la llamada de envío al escribir datos en un socket. Dado que el proceso de escritura de datos a otra máquina lleva su tiempo, se devuelve la llamada antes de enviar la transferencia de datos. Por lo tanto, en la mayoría de los casos, el sistema operativo sólo conoce el estado después de que los datos no se han enviado correctamente. 

La manipulación de señales es vulnerable a que se produzca un estado de espera, pues las señales son asíncronas y puede ocurrir que llegue otra señal (incluso del mismo tipo) al proceso mientras transcurre la ejecución de la función que manipula la señal.



Ejemplos de tipos de eventos que puede crear una señal:        
  • Un error del programa, tales como la división por cero o la emisión de una dirección fuera del rango válido.
  • A petición del usuario para interrumpir o terminar el programa.
  • La terminación de un proceso hijo.
  • Expiración de un reloj o alarma.
  • Un llamado a matar a otro proceso (o el mismo).
  • Un intento de realizar una ilegal operación de E / como por ejemplo la lectura de una tubería cuando se rompe el vínculo
Como se puede ver fácilmente, los eventos que generan las señales se dividen en tres categorías principales: los errores, los eventos externos y las solicitudes explícitas.
 
Un error significa que el programa realiza algo inválido. Pero no todos los tipos de errores generan señales - de hecho, la mayoría no. Por ejemplo, intenta abrir un archivo que no existe genera un error, pero no crea la señal. Este error está asociado con una llamada biblioteca específica. Los errores que generan las señales son las que pueden ocurrir en cualquier lugar dentro del programa, no sólo en llamadas a las bibliotecas. Estos incluyen la división por cero y las direcciones de memoria no válida. 

Un evento externo en general, tiene que ver con I / O de otros procesos. Estos incluyen la llegada de entrada, la expiración de un temporizador o la terminación de un proceso hijo. 

Una petición explícita significa el uso de una función de biblioteca como matar cuya finalidad es, precisamente para generar una señal.

Dado que las señales WIN32 son un subconjunto de las señales de Unix, la siguiente es una lista de las señales de WIN32. 
Sistemas de señalización llamada y comandos

Aumentar la llamada al sistema: int raise( int sig ) : Enviar señales a sí mismo.

Establece el manejo de señales de interrupción:
 
 void (__cdecl *signal(int sig,void(__cdecl*func )(int [,int] )))(int);
 
Parametros
sig          Valor de la señal. 

Func       Función que se ejecutará. El primer parámetro es un valor de la señal y el segundo  parámetro es un subcódigo que se puede utilizar cuando el primer parámetro es SIGFPE. 

Valor de Retorno 
La señal  devuelve el valor anterior de la función asociada a la señal dada. Por ejemplo, si el valor anterior de la función se SIG_IGN, el valor de retorno es también SIG_IGN. Un valor de retorno de SIG_ERR indica un error, en cuyo caso errno toma el valor EINVAL.

De manera predeterminada, la signal termina el programa de llamada con el código de la salida 3, independientemente del valor de la sig.

Sistema lento  de llamadas - llamadas al sistema que  se pueden bloquear para siempre.   errno = EINTR si estas llamadas se interrumpen.

No hay comentarios:

Publicar un comentario