miércoles, 10 de marzo de 2010

SIGNAL

La llamada al sistema signal() es utilizada para establecer un manejador de señales para un
determinado tipo de señal. signal() acepta un numero de señal y un apuntdor a la función
manejadora de señales, y prepara la manejador para aceptar la señal dada.

Si hay un manipulador de señal para una señal dada se invoca y, si no lo hay, se usa el
manipulador por defecto. El proceso puede especificar también dos comportamientos por
defecto sin necesidad de crear un manipulador: ignorar la señal (SIG_IGN) y usar el
manipulador por defecto (SIG_DFL). Hay dos señales que no pueden ser interceptadas ni
manipuladas: SIGKILL y SIGSTOP.

NOMBRE
signal - manejo de señales en ANSI C

SINOPSIS
#include
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

DESCRIPCIÓN
La llamada al sistema signal() instala un nuevo manejador de señales para la señal
con número signum. El manejador de señales queda establecido a sighandler que
puede ser una función especificada por el usuario o bien SIG_IGN o SIG_DFL.
Cuando llega una señal con número signum ocurre lo siguiente.
· Si el manejador correspondiente está establecido a SIG_IGN, la señal es ignorada.
· Si el manejador está establecido a SIG_DFL, se realiza la acción por defecto
asociada a la señal.
· Si el manejador está establecido a una función sighandler lo primero que se hace
es o bien restablecer el manejador a SIG_DFL o un bloqueo de la señal que
depende de la implementación, invocando después a sighandler con el argumento
signum.

LISTA DE SEÑALES
La Single Unix Specification especifica las siguientes señales, definidas en :
· SIGABRT - Proceso abortado.
· SIGALRM - Señal de alarma, salta al expirar el timer. Reprogramable.
· SIGBUS - Error en el bus "access to undefined portion of memory object"(SUS).
· SIGCHLD - Proceso hijo terminado, detenido (*o que continúa). Tratamiento por
defecto: ignorar. Reporgramable.
· SIGCONT - Continúa si estaba parado.Tratamiento por defecto: continuar.
Reprogramable.
· SIGFPE - Excepción de coma flotante -- "erroneous arithmetic operation"(SUS).
· SIGHUP - Hangup, al salir de la sessión se envía a los processos en Background.
Tratamiento por defecto: exit. Reprogramable.
· SIGILL - Instrucción ilegal.
· SIGINT - Interrupción, se genera al pulsar "^c" durante la ejecución. Tratamiento
por defecto:exit. Reprogramable.
· SIGKILL - Destrucción inmediata del proceso.Tratamiento:exit. No reprogramable,
no ignorable.
· SIGPIPE - Se genera al escribir sobre la pipe sin lector. Tratamiento por
defecto:exit. Reprogramable.
· SIGQUIT - Terminar.
· SIGSEGV - segmentation violation.Salta con dirección de memoria ilegal.
Tratamiento por defecto:exit + volcado de memoria. Reprogramable.
· SIGSTOP - Detiene el proceso. Se genera al pulsar "^z" durante la ejecución. No
reprogramable, no ignorable.
· SIGTERM - Terminación. Tratamiento por defecto:exit. Reprogramable.
· SIGTSTP - Parada de terminal.
· SIGTTIN - Proceso en segundo plano intentando leer ("in").
· SIGTTOU - Proceso en segundo plano intentando escribir ("out").
· SIGUSR1 - User defined 1. Signal definido por el usuario.Tratamiento por defecto:
exit. Reprogramable.
· SIGUSR2 - User defined 2. Signal definido por el usuario.Tratamiento por defecto:
exit. Reprogramable.
· *SIGPOLL - Pollable event.
· *SIGPROF - El temporizador copiador expiró.
· *SIGSYS - Mala llamada al sistema.
· *SIGTRAP - Trace/breakpoint trap.
· SIGURG - datos importantes disponibles en socket
· *SIGVTALRM - "virtual timer expired"(SUS)
· *SIGXCPU - excedido límite de tiempo de CPU
· *SIGXFSZ - excedido límite de tamaño de fichero
Nota: el asterisco significa que es una extensión de X/Open System Interfaces (XSI). Las
frases entre comillas y seguidas de (SUS) son la forma de escribirlas del SUS[1].

EJEMPLO
#include /* standard I/O functions */
#include /* standard unix functions, like getpid() */
#include /* signal name macros, and the signal() prototype */

/* first, here is the signal handler */
void catch_int(int sig_num)
{
/* re-set the signal handler again to catch_int, for next time */
signal(SIGINT, catch_int);
printf("Don't do that\n");
fflush(stdout);
}

int main(int argc, char* argv[])
{
/* set the INT (Ctrl-C) signal handler to 'catch_int' */
signal(SIGINT, catch_int);

/* now, lets get into an infinite loop of doing nothing. */
for ( ;; )
pause();
}


No hay comentarios:

Publicar un comentario