首页 文章

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

提问于
浏览
0

我在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

    信号处理程序就像一个中断,不会返回给任何人 . 您发布的链接说明了在设置信号处理程序时返回值而不是信号处理程序返回值(请注意 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这样的信号 .

相关问题