我正在编写一个设置终端属性的程序,因此我必须在脚本退出时重置终端,包括用户按 ^Z,但是当我使用 fg 重新输入命令时,会发送 SIGCONT 信号两次,但我只希望它被调用 1 次。为什么会发生两次?这是一个显示问题的简短程序:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void sigtstp (int signum) {
write(1, "got a SIGTSTP\n", 14);
kill(getpid(), SIGSTOP);
}
void sigcont (int signum) {
write(1, "got a SIGCONT\n", 14);
}
int main (int argc, char **argv) {
signal(SIGTSTP, sigtstp);
signal(SIGCONT, sigcont);
while (1) {
sleep(100);
}
}
输出是这样的:
% clang cont.c -o cont
% ./cont
^Zgot a SIGTSTP
zsh: suspended (signal) ./cont
% fg
[5] continued ./cont
got a SIGCONT
got a SIGCONT
^C
我在 macOS 上使用 zsh。
最佳答案
这是 zsh 版本 5.7、5.7.1、5.8 和 5.8.1 中的一个已知错误。 Erik Paulson 已针对 zsh 5.9 修复了该问题:
https://www.zsh.org/mla/workers/2021/msg01255.html
在 Ubuntu 20.04 - 22.04 上,此 zsh 错误会导致 fg
有时无法恢复已停止的 vim
。由于某种未知的原因,额外的 SIGCONT 导致 vim 再次立即停止。
关于c - 为什么我会收到两个 SIGCONT 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64531411/