我有这个密码:

#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?)使你的程序工作。

09-04 01:37