Unix编程 - 信号处理程序

时间:2011-11-23 12:15:55

标签: c unix signals

我试图在c中写一个小壳时遇到了一些问题。

问题如下:假设我已经为信号处理程序编写了一些代码,在这种情况下,它被修改为捕获SIGCHLD信号,我怎么能通知我的程序信号已被捕获?
如果我使用全局变量,问题很容易,但这不是我想要的方式。所以任何建议/提示都将不胜感激!

这就是我现在解决的问题。

volatile sig_atomic_t exit_status; /* <--global variabel */

void sigchld_handler(int signal) {
    switch (signal) {
    case SIGCHLD:
        exit_status = 1; /* SIGCHLD was caught, notify program.. */
        break;
    default:
        fprintf(stderr, "Some signal catched\n"); /* not a signal of intrest */
        break;
    }
}

//由于

3 个答案:

答案 0 :(得分:2)

标准解决方案是使用unix self-pipe trick。好处是管道的读取端可以与select()epoll()一起使用,从而与event loops很好地集成,而不必定期轮询原子变量的值。

答案 1 :(得分:1)

signal(7)包含可在信号处理程序中安全执行的函数列表; fprintf(3)不是其中之一。如果孩子在shell打印提示或状态消息时死亡会怎样?通常会导致数据结构损坏。 (这对于玩具来说很好 - 但我不希望这个在外壳中。)

设置全局变量对于信号处理程序来说非常典型。这是一个简单的方法来通知进程的主事件循环或主处理循环,其他东西需要完成。

答案 2 :(得分:1)

老实说,这看起来像全局变量的完美案例。但如果您不想这样做,那么有很多选择:http://beej.us/guide/bgipc/output/html/multipage/index.html从列表中选择最适合您架构的一个。

相关问题