2013-07-18 4 views
3
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/signal.h> 
#include <string.h> 

void handler (int sig); 
int count; 

int main() { 

    struct sigaction act; 
    memset (&act, 0, sizeof (act)); 


    act.sa_handler = handler; 
    if (sigaction (SIGHUP, &act, NULL) < 0) { 
     perror ("sigaction"); 
     exit (-1); 
    } 

    int count = 0; 
    while(1) { 
     sleep(1); 
     count++; 
    } 

} 

void handler (int signal_number){ 
     printf ("count is %d\n", count); 
} 

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

+0

Почему вывод всегда «счет 0»? Почему isnt обработка count ++ – DDukesterman

+0

Вы повторно объявили счет в основном. Обработчик sig читает глобальный «счет». – aet

+0

исправил это. знал, что он игнорирует somhting на счете – DDukesterman

ответ

2

Вы можете использовать kill -SIGHUP <pid>, где <pid> - это идентификатор процесса вашего кода.

1

попробовать это в консоли:

ps -a 

зачитал ИДП вашей программы

kill -s HUP target_pid 

Here you have страница руководства для убийства со списком сигналов.

EDIT: еще проще можно использовать killall:

killall -HUP nameofyourbinary 
4

Технически это не безопасно делать I/O в обработчике сигнала, лучше установить флаг, следить за ним, и печать на основе флаг. В системе posix вы можете «убить -HUP» из командной строки, чтобы отправить сигнал.

+0

+1 для обозначения опасности ввода-вывода –

+0

Не только printf, все функции выполняют прерывания сигнала, malloc(), здесь [Список авторизованных функций] (http://man7.org/linux/man-pages/man7/ signal.7.html) –

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