Herramientas de usuario

Herramientas del sitio


senales

¡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.

  /* Leer una lnea del teclado dndole 10 segundos de plazo */
  #include <stdio.h>
  #undef __USE_BSD /* para que el read pueda ser interrumpido por una seal */
  #include <signal.h>
  #include <unistd.h>
        
  volatile int flag; 
        
  /* funcin para atrapar la seal de alarma */
  void ring() {
    flag=0;
  }
        
  /* funcin que lee con timeout */
  int gettext(char *buf, int bufsize, int timeout) {
    int nchars;
        
    signal(SIGALRM, ring);
    flag= 1;
    alarm(timeout);
    nchars= read(STDIN_FILENO, buf, bufsize);
    alarm(0); /* para cancelar alarma pendiente */
    if (!flag)
      nchars= 0;
    buf[nchars]= '\0';
    return nchars;
  }
        
  #define MAXLINEA 100
  int main() {
    char linea[MAXLINEA+1];
        
    printf("Escriba su nombre: ");
    fflush(stdout);
    if (gettext(linea, MAXLINEA, 10)>0)
      printf("Gracias %s", linea);
    else
      printf("*** TIMEOUT ***\n");
    return 0;
  }
senales.1348529939.txt.gz · Última modificación: 2012/09/24 23:38 por lmateu