Возникли проблемы при использовании sigaction с сигналом таймера - PullRequest
1 голос
/ 15 марта 2011

Привет всем я пытаюсь использовать sigaction () однако безуспешно это мой код:

int main()
{

struct sigaction act, oact;
act.sa_handler = (void *)g;

sigaction(SIGVTALRM,&act,&oact);

struct itimerval tv;
tv.it_value.tv_sec = 2; //time of first timer
tv.it_value.tv_usec = 0; //time of first timer
tv.it_interval.tv_sec = 2; //time of all timers but the first one
tv.it_interval.tv_usec = 0; //time of all timers but the first one

setitimer(ITIMER_VIRTUAL, &tv, NULL);

for (;;);
}

это г ():

void g( void ){

    printf("I'M NOT IN G!!");
    for (;;);
}

когда я запускаю код, я застреваю в первом цикле for (;;), даже не доходя до g (). почему бы мне не добраться до g (), если я определил его как функцию, обрабатывающую сигнал?

спасибо

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Во-первых, вы должны убедиться, что структура ввода struct sigaction является чистой:

sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = g;

Затем вам следует приостановить процесс, а не использовать цикл ожидания "spin":1006 *

Наконец, ваш обработчик сигналов должен быть определен правильно и не использовать функцию printf (), которая считается небезопасной при наличии сигналов и не должна использоваться в обработчике сигналов.Вместо этого он должен установить атомарный флаг:

static volatile sig_atomic_t g_called;

void g(int sig) {
    g_called = 1;
}
0 голосов
/ 15 марта 2011

Основная проблема заключается в том, что вы используете неинициализированную структуру sigaction. Либо инициализируйте его с помощью:

struct sigaction act = {0};

Или используйте memset, чтобы очистить его перед вызовом sigaction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...