在C中我的信号处理函数后如何避免scanf?

时间:2015-10-09 14:19:57

标签: c linux signals

我有这段代码:

#include <stdio.h>
#include <signal.h>
void signal_handler(int signal) {
    printf("Caught signal in CHILD.\n");
}

int main(void) {
    int s;
    signal(SIGTSTP, signal_handler);
    while(1){
         printf("%s@%s/# ",getlogin(),get_current_dir_name());
         scanf("%d",&s);
    }
    return 0;
}

当我运行它打印的代码时:

something: ^ZCaught signal in CHILD.

据我所知,当我按下ctr-z时,scanf不会执行。虽然在我的函数内的printf之后,它直接进入scanf,等待输入然后再次启动循环。当我按下ctr-z并再次启动while循环时,有什么办法可以避免scanf吗?我尝试了类似的东西

void signal_handler(int signal) {
    printf("Caught signal in CHILD.\n");
    printf("%s@%s/# ",getlogin(),get_current_dir_name());
}

但它没有用。在第二个printf直接进入scanf之后,等待输入然后再次启动循环。我能以某种方式再次启动循环吗?

1 个答案:

答案 0 :(得分:1)

信号处理程序在其scanf STDIN期间中断read。但是,由于您设置信号处理的方式,read系统调用会在返回信号处理程序后立即重新启动。这就是为什么你被“卡在”scanf而不是回到你的循环顶部。

您可以做的一件重要事情是use sigaction rather than signal。这将强制您指定中断调用的行为:是否重启?

接下来要做的是将信号处理程序限制为async-signal-safe的函数,以免冒misery的风险。

顺便说一下,要做的另一项更改是向我们提供所有必需的包含(<unistd.h>?)并定义(_GNU_SOURCE?)以使您的计划有效。