如何从C中的信号处理程序获取返回值?

时间:2017-01-18 12:58:50

标签: c signals

我在this链接中读到了一个类似的问题,但它没有解决我的问题,所以对重复的问题道歉。

我有以下代码,在程序执行时基本上接收Ctrl + C和Ctrl + Z,但我希望2信号处理函数在收到来自终端的信号时返回1。

链接说了一些关于使用typedef并且对C来说相当新的东西我不知道如何在我的代码中实现它。

以下是代码:

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

/* Signal Handler for SIGINT */
void sigintHandler(int sig_num) {

    signal(SIGINT, sigintHandler);
    printf("\n Cannot be terminated using Ctrl+C \n");
    fflush(stdout);
}

/* Signal Handler for SIGTSTP */
void sigtstpHandler(int sig_num) {  
    signal(SIGTSTP, sigtstpHandler);
    printf("\tCtrl+z received\n");  
    fflush(stdout);
}

int main (void) {

    signal(SIGINT, sigintHandler);
    signal(SIGTSTP, sigtstpHandler); 

    while(1) {}  //infinite loop.
    return 0;
}

感谢您的时间/帮助。

编辑:我想要当前

的2个信号处理函数
    void sigintHandler(int sig_num)
    void sigtstpHandler(int sig_num)

返回1而不是虚空。所以我可以做一些像

这样的事情
int sigIntReturn = signal(SIGINT, sigintHandler);

在主函数中。

1 个答案:

答案 0 :(得分:0)

信号处理程序就像一个中断,不会返回给任何人。您发布的链接说明了在设置信号处理程序时返回值而不是信号处理程序返回值(注意signal只是设置信号处理程序)。

但是,无论何时发生信号,您都可以执行与以下类似的操作。

volatile int g_flag = 0;
void sigintHandler(int sig_num) {

    signal(SIGINT, sigintHandler);

    /* Not safe to use these functions in a signal handler */
    printf("\n Cannot be terminated using Ctrl+C \n");
    fflush(stdout);
    g_flag = 1;
}

int main (void) {

    signal(SIGINT, sigintHandler);
    signal(SIGTSTP, sigtstpHandler); 

    while(g_flag == 0) {}  //infinite loop.
    return g_flag;
}

请注意,这是一个繁忙的主循环,不建议使用。你使用像eventfd这样的信号来发信号。