Я пытаюсь узнать, как поймать сигммер для большего задания, которое у меня есть в классе. Я следую шагам в этом 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;
}
Хотя не ответ на ваш вопрос, вы не должны использовать функции, которые не Реентрантная внутри обработчика сигнала. _printf_ является одним из них. Это SO [вопрос/ответ] (http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in-a-signal-handler) может быть полезно посмотреть на –
Что произойдет, если вы явно используйте номер сигнала (TERM) с 'kill' в дочернем процессе. Как в 'kill -TERM' где '' - это идентификатор дочернего процесса. –
Мое лучшее предположение, хотя это - когда вы сделали это учебное пособие, вы не знали, что вы должны открывать два сеанса терминала. Один для запуска программы и второй терминал для выдачи команды 'kill'. Я предполагаю, что вы запустили свою программу, и в том же терминале вы выдали команду kill. Выполняя это, как предлагает учебник, требуется _TWO_ активных терминальных сеансов. –