LINUX.ORG.RU

Обработка сигналов в линуксе

 , , ,


0

2

Не понимаю, в этом коде все работает нормально, как и должно быть, таймер не завершает работу после первой секунды.

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

static int count = 0;

struct itimerval timer;

int in = 1;

void sighandler(int sig)
{
    if (sig == SIGALRM)
    {
        count++;
        printf("%d\n", count);

        if (count % 3 == 0)
        {
            timer.it_interval.tv_sec = 0;
            timer.it_value.tv_sec = 0;
            setitimer(ITIMER_REAL, &timer, NULL);
            in = 1;
        }
    }
}
int main()
{
    signal(SIGALRM, sighandler);

    char ch = '0';
    while (1)
    {
        if (in == 1)
        {
            printf("input> ");
            scanf("%c", &ch);
            switch (ch)
            {
                case 's':
                {
                    timer.it_interval.tv_sec = 1;
                    timer.it_value.tv_sec = 1;
                    setitimer(ITIMER_REAL, &timer, NULL);
                    in = 0;
                    break;
                }
                default: break;
            }
        }   
    }
    
    return 0;
}

В другом же коде (не могу его показать), где сама структура идентична этому коду, таймер завершает работу после первого достижения нуля значением it_value. И при этом программа завершается с выводом в терминал «Сигнал таймера», хотя цикл while (1) не должен допускать этого... Вторые сутки бьюсь уже. !!!ЕДИНСТВЕННОЕ!!! что отличает этот код от моего - терминал работает в неканоническом режиме. Но, по идее, это не должно влиять на работу обработчика сигнала. В чем может быть проблема?



Последнее исправление: kennydzzze (всего исправлений: 1)
Ответ на: комментарий от vodz

Я о том и говорил, что таймер вручную перезапускать не нужно, когда он вызывается в бесконечном цикле или перед ним. Код в шапке это демонстрирует. Однако в реальном коде, где обработчик сигнала и вызов таймера идентичны этому коду, сигнал SIGALRM не посылается повторно.

kennydzzze
() автор топика
Ответ на: комментарий от kennydzzze

Нет. Говорю же, возьми strace, в конце концов.

post-factum ★★★★★
()
Ответ на: комментарий от kennydzzze

Вы не поняли, я перечислил три первых пункта, остальное лень расписывать. Ваш код ужасен. Без SA_RESTART ваш scanf может положить в ch что угодно, а вы не проверяя ошибку делаете switch(). И так далее.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Это вы меня не поняли. Мне все равно как написан этот код в шапке, ибо он только для примера, пусть и грубого.

kennydzzze
() автор топика
Ответ на: комментарий от vodz

Как раз таки эта «хочушка» работает на грубом примере. И такая же «хочушка» в реальном коде, но написанная более гладко НЕ работает.

kennydzzze
() автор топика
Ответ на: комментарий от kennydzzze

Ты не замечаешь того, что тебе пишут. Ещё раз — ПОЖАЛУЙСТА — запусти свой драгоценный секретный код из-под strace и разберись в том, что получишь.

post-factum ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.