LINUX.ORG.RU

История изменений

Исправление beastie, (текущая версия) :

Ты хотя бы в код заглянул, что ли. Я ведь не зря весь код, а не только sniplets, привёл. ;)

В обработчике меняются только флаги:

#include <sys/time.h>
#include <signal.h>
#include <stdio.h>

int gotalrm = 0;

void
catch(int sig)
{
        if (sig == SIGALRM)
                gotalrm = 1;
}

int
main()
{
        struct sigaction sa;
        struct itimerval it;

        sigemptyset(&sa.sa_mask);
        sa.sa_flags = 0;
        sa.sa_handler = catch;
        sigaction(SIGALRM, &sa, NULL);

        it.it_value.tv_sec = 1;
        it.it_value.tv_usec = 0;
        it.it_interval = it.it_value;
        setitimer(ITIMER_REAL, &it, NULL);

        for (;;) {
                if (gotalrm) {
                        puts("dong");
                        gotalrm = 0;
                }
                sigsuspend(&sa.sa_mask);
        }

        return 0;
}

PS: поправил для полноты картины.

Исправление beastie, :

Ты хотя бы в код заглянул, что ли. Я ведь не зря весь код, а не только sniplets, привёл. ;)

В обработчике меняются только флаги. В данном конкретном случае, даже и этого не надо. Достаточно будет:

#include <sys/time.h>
#include <signal.h>
#include <stdio.h>

int gotalrm = 0;

void
catch(int sig)
{
        if (sig == SIGALRM)
                gotalrm = 1;
}

int
main()
{
        struct sigaction sa;
        struct itimerval it;

        sigemptyset(&sa.sa_mask);
        sa.sa_flags = 0;
        sa.sa_handler = catch;
        sigaction(SIGALRM, &sa, NULL);

        it.it_value.tv_sec = 1;
        it.it_value.tv_usec = 0;
        it.it_interval = it.it_value;
        setitimer(ITIMER_REAL, &it, NULL);

        for (;;) {
                if (gotalrm) {
                        puts("dong");
                        gotalrm = 0;
                }
                sigsuspend(&sa.sa_mask);
        }

        return 0;
}

Исходная версия beastie, :

Ты хотя бы в код заглянул, что ли. Я ведь не зря весь код, а не только sniplets, привёл. ;)

В обработчике меняются только флаги. В данном конкретном случае, даже и этого не надо. Достаточно будет:

#include <sys/time.h>
#include <signal.h>
#include <stdio.h>

void
catch(int sig)
{
        /* do nothing */
}

int
main()
{
        struct sigaction sa;
        struct itimerval it;

        sigemptyset(&sa.sa_mask);
        sa.sa_flags = 0;
        sa.sa_handler = catch;
        sigaction(SIGALRM, &sa, NULL);

        it.it_value.tv_sec = 1;
        it.it_value.tv_usec = 0;
        it.it_interval = it.it_value;
        setitimer(ITIMER_REAL, &it, NULL);

        for (;;) {
                puts("dong");
                sigsuspend(&sa.sa_mask);
        }

        return 0;
}