我试图在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;
}
}
//由于
答案 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从列表中选择最适合您架构的一个。