Publi

  • Conociendo el proceso que me ha enviado una señal (signal)

    Hace tiempo hablábamos de capturar señales, aunque en ocasiones, es necesario saber quién me envía esa señal, si por ejemplo nos envían un SIGINT o SIGTERM, tal vez queremos saber qué proceso nos quiere muerto y qué usuario lo ha invocado. O tal vez estamos esperando una señal de control (SIGUSR1, por ejemplo) por parte de un proceso cliente específico.

    El problema es que por nuestro modo actual de direccionar señales (con signal(señal, funcion)) sólo comunicamos el número de señal que se ha recibido, sin más información.… Leer artículo completo

  • Controlar señales

    A veces, se nos presenta la necesidad de modificar el comportamiento de nuestro programa por ejemplo cuando el usuario pulse Control+C, o cuando terminemos nuestra aplicación, o cuando… dividamos por 0, o más cosas… podemos ver un listado de las diferentes señales con:

    man 7 signal

    Podemos utilizar para probar este programa (signals.c):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <signal.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    void salir(int recib);
    void alarma(int que);
    int tmp=0;
    int divi=5;
    int main()
    {
        signal(SIGINT, salir);  /* Control+C */
        signal(SIGKILL, salir); /* kill */
        signal(SIGFPE, salir);  /* división por 0 */
        signal(SIGALRM, alarma);    /* alarma */
        signal(SIGUSR1, alarma);    /* definido por el usuario */
        int numero=4;
        while (1)
            {
                usleep(1000);       /* Le damos un respiro a la CPU mientras estamos en el bucle */
                tmp++;
                if (tmp%1000==0)
                {
                    tmp=tmp/divi;
                    printf("tmp = %d\n", tmp);
                }
            }
    }
    void salir(int recib)
    {
        printf("Salgo porque ");
        switch (recib)
            {
            case SIGINT: printf("has pulsado Control+C...
    Leer artículo completo