2016-10-25 2 views
-2

Я пытался следующие программы обработчика сигнала, имея в виду от онлайн учебник, но это не кажется, работает, что случилось с моим кодом:Почему мой обработчик сигнала не работает с использованием функции sigaction?

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

typedef void (*SignalHandlerPointer)(int); 

static void UsrHostSigAbort(int pSignal) 
{ 
     //stopService(); 
    printf("pankaj"); 
} 
void HandleHostSignal() 
{ 
     struct sigaction satmp; 
     memset(&satmp, '\0' , sizeof(satmp)); 
     SignalHandlerPointer usrSigHandler; 
     satmp.sa_flags &= ~SA_SIGINFO; 
     satmp.sa_handler = UsrHostSigAbort; 
     usrSigHandler = sigaction (SIGINT , &satmp, NULL); 
} 

void main() 
{ 
HandleHostSignal(); 

while(1) 
{ 
sleep(1); 
} 
} 

Я компиляции и запуска этой программы в убунту.

+0

Какую операционную систему вы используете? – Ari0nhh

+0

@ Ari0nhh это ubuntu, обновил Q с помощью этой информации. –

+1

Обратите внимание на обсуждение в [Как избежать использования 'printf()' в обработчике сигналов?] (Http://stackoverflow.com/questions/16891019/) Вероятно, это не причина вашей проблемы, но вы должны быть осознавая описанные проблемы. –

ответ

3

Этот код - который является в основном только тривиальное вариант на ваш код - работает правильно на MacOS Sierra 10.12.1:

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

static void UsrHostSigAbort(int pSignal) 
{ 
    // stopService(); 
    // Using printf is not good - see: http://stackoverflow.com/questions/16891019/ 
    // It will suffice for this code, however. 
    printf("pankaj %d\n", pSignal); 
} 

static void HandleHostSignal(void) 
{ 
    struct sigaction satmp; 
    sigemptyset(&satmp.sa_mask); 
    satmp.sa_flags = 0; 
    satmp.sa_handler = UsrHostSigAbort; 
    sigaction(SIGINT, &satmp, NULL); 
} 

int main(void) 
{ 
    HandleHostSignal(); 

    while (1) 
    { 
     sleep(1); 
     putchar('.'); 
     fflush(stdout); 
    } 
} 

Пример вывода (программа под названием sig19):

$ ./sig19 
......^Cpankaj 2 
.....^Cpankaj 2 
....^Cpankaj 2 
...^Cpankaj 2 
..^Cpankaj 2 
.^Cpankaj 2 
..................^\Quit: 3 
$ 

I использовал клавишу quit (^\ на моем терминале), чтобы остановить программу.

+0

Спасибо Джонатан, его рабочий –

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