我有这个密码:
#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时,扫描不会执行。虽然在我的函数中打印完之后,它会直接进入扫描,等待输入,然后再次启动循环。当我按下ctr-z并再次启动while循环时,有没有办法避免扫描?我试过那样的东西
void signal_handler(int signal) {
printf("Caught signal in CHILD.\n");
printf("%s@%s/# ",getlogin(),get_current_dir_name());
}
但没用。在第二个printf直接进入scanf之后,等待输入,然后再次开始循环。不知怎的,我能重新开始循环吗?
最佳答案
信号处理器在STDIN的scanf
期间中断read
。但是,由于您设置信号处理方式的原因,read
系统调用在信号处理程序返回后立即重新启动。这就是为什么你被“卡”在scanf
中而不是回到循环的顶部。
你能做的一件重要的事就是use sigaction
rather than signal
。这将迫使您指定中断调用的行为:是否重新启动它们?
下一步要做的是将信号处理程序限制为async-signal-safe的函数,以免有misery的风险。
另外,另一个需要做的更改是为我们提供所有必需的包括(<unistd.h>
?)定义(_GNU_SOURCE
?)使你的程序工作。