2015-11-21 3 views
0

Я пытаюсь узнать, как поймать сигммер для большего задания, которое у меня есть в классе. Я следую шагам в этом tutorial, но это не работает для меня. Когда я вхожу в команду «kill [process id]», сон не останавливается и просто продолжается. Я пробовал убивать как дочерние, так и родительские идентификаторы, и ничего не происходит. Есть идеи? Вот что у меня есть:Ловля SIGTERM в C

#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

volatile sig_atomic_t done = 0; 

void term(int signum) 
{ 
    printf("Caught!\n"); 
    done = 1; 
} 

int main(int argc, char *argv[]) 
{ 
    struct sigaction action; 
    memset(&action, 0, sizeof(action)); 
    action.sa_handler = term; 
    sigaction(SIGTERM, &action, NULL); 

    int pid = getpid(); 
    int parentID = getppid(); 
    printf("PID is %d and Parent is %d \n",pid, parentID); 

    int loop = 0; 
    while (!done) 
    { 
     printf("PID is %d and Parent is %d \n",pid, parentID); 
     int t = sleep(10); 
     /* sleep returns the number of seconds left if 
     * interrupted */ 
     while (t > 0) 
     { 
      printf("Loop run was interrupted with %d " 
        "sec to go, finishing...\n", t); 
      t = sleep(t); 
     } 
     printf("Finished loop run %d.\n", loop++); 
    } 

    printf("done.\n"); 
    return 0; 
} 
+0

Хотя не ответ на ваш вопрос, вы не должны использовать функции, которые не Реентрантная внутри обработчика сигнала. _printf_ является одним из них. Это SO [вопрос/ответ] (http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in-a-signal-handler) может быть полезно посмотреть на –

+0

Что произойдет, если вы явно используйте номер сигнала (TERM) с 'kill' в дочернем процессе. Как в 'kill -TERM ' где '' - это идентификатор дочернего процесса. –

+0

Мое лучшее предположение, хотя это - когда вы сделали это учебное пособие, вы не знали, что вы должны открывать два сеанса терминала. Один для запуска программы и второй терминал для выдачи команды 'kill'. Я предполагаю, что вы запустили свою программу, и в том же терминале вы выдали команду kill. Выполняя это, как предлагает учебник, требуется _TWO_ активных терминальных сеансов. –

ответ

1

работает отлично:

> cat > sig.c # paste your code 
> gcc sig.c 
> ./a.out & 
[1] 20549 
PID is 20549 and Parent is 15574 
PID is 20549 and Parent is 15574 
> kill 20549 
Caught! 
Loop run was interrupted with 1 sec to go, finishing... 
> Finished loop run 0. 
done. 
> 
[1] Done       ./a.out 
+0

Это не работает на моем mac. Моя программа просто переходит к следующей строке. – user2466886

+0

Что вы имеете в виду, * "переходит к следующей строке" *? Вы выполняете свой процесс в фоновом режиме? Или у вас есть 2 терминала, один из которых запускает вашу программу, а другой - с командной строкой? – Kenney

+0

Я буквально означаю, что курсор перемещается к строке под командой kill (тот же ответ, если я только что нажал enter). Нет. Я ничего не запускаю в фоновом режиме или не открываю 2 терминала. По какой-то причине шаги в учебнике для меня не работают – user2466886

Смежные вопросы