c - 为什么我会收到两个 SIGCONT 信号?

标签 c signals zsh

我正在编写一个设置终端属性的程序,因此我必须在脚本退出时重置终端,包括用户按 ^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/

相关文章:

c - 连续的 calloc 调用损坏了一些内存

创建一个 void* 数组,每个数组都指向 2d int 矩阵?

关闭 C 应用程序以确保关键部分完成的正确方法?

zsh - 如何在 zsh 提示符下获取绝对路径?

c - 将字符串分配给 C 结构中的元素

c - 如何在 C 中返回数组中最大的两个数?

c 报告哪个信号终止了子进程

Android,使用超声波传输信号

bash - 将进程执行时间包含在 shell 提示符中

bash - zsh 中奇怪的 "jobs"行为