¡Esta es una revisión vieja del documento!
Señales
Las señales informan a un proceso cuando ha ocurrido un evento. Los eventos pueden ser síncronos (p.ej. errores) o asíncronos (p.ej. terminación de otro proceso). Un proceso tiene que realizar una acción en respuesta a la señal. Durante el tiempo entre que la señal se activa y el proceso la atiende se dice que la señal está pendiente.
Un proceso puede bloquear algunas señales, mediante una máscara de señales (signal mask). Esta máscara se hereda en caso de fork/exec.
Posibilidades de proceso de una señal:
- Terminar el proceso.
- Ignorar la señal.
- Detener el proceso.
- Reanudar el proceso.
- Atrapar la señal mediante una función del programa.
Señales estándares:
señal | significado |
---|---|
SIGALRM | Alarma |
SIGFPE | División por cero |
SIGHUP | Hangup |
SIGINT | control-C |
SIGKILL | Terminación (no se puede atrapar) |
SIGPIPE | Broken Pipe |
SIGTERM | Terminación |
Para contarle al sistema cómo se debe manejar una señal, se usa
signal(señal, accion);
Acciones asociadas a una señal:
nombre | significado |
---|---|
SIG_DFL | Default action |
SIG_IGN | Ignore |
Puntero a una función | Se ejecuta la función con la señal como parámetro y luego se reanuda el programa |
Un programa le puede enviar una señal a un proceso invocando:
kill(pid, señal);
y para enviarse una señal a sí mismo:
raise(señal);
Para esperar una señal:
pause(); /* suspende hasta que llegue una señal */
Para esperar durante un número dado de segundos:
sleep(num_segundos); /* despierta al final de ese período o cuando llega una señal; retorna número de segundos restantes */
Para programar una alarma:
alarm(num_segundos); /* genera SIGALRM en ese número de segundos */
Ejemplo: Lectura con timeout.