我有这段代码:
#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之后,等待输入然后再次启动循环。我能以某种方式再次启动循环吗?
答案 0 :(得分:1)
信号处理程序在其scanf
STDIN期间中断read
。但是,由于您设置信号处理的方式,read
系统调用会在返回信号处理程序后立即重新启动。这就是为什么你被“卡在”scanf
而不是回到你的循环顶部。
您可以做的一件重要事情是use sigaction
rather than signal
。这将强制您指定中断调用的行为:是否重启?
接下来要做的是将信号处理程序限制为async-signal-safe的函数,以免冒misery的风险。
顺便说一下,要做的另一项更改是向我们提供所有必需的包含(<unistd.h>
?)并定义(_GNU_SOURCE
?)以使您的计划有效。