zsh/sh/bash 如何检查从 C++ 程序启动的命令 "cat &" 的信号 SIGTTIN

How zsh/sh/bash check signal SIGTTIN for command "cat &" launched from a c++ program

我不明白终端如何知道是否在后台模式下使用了二进制文件stdin

我有一个 C++ 程序,它必须在后台 运行 命令,如 /bin/cat,但我没有收到错误消息:

cat is stopped because it used stdin and got SIGTTIN

原因是此时 cat 正在等待 stdin 上的输入,但您还没有给它输入文件(通过 < in 或通过管道像 echo foo | cat &) 并且它没有像 stdin 那样连接到你的终端,因为你把它放在后台,所以它一尝试从 [=11= 读取就得到了信号 SIGTTIN ].终端会收到通知,因为交互式终端默认启用作业控制,因此当后台作业暂停等待来自 stdin 的输入时,会弹出消息。

如果您尝试从 C++ 程序在后台打开 cat,您必须确保在启动 [=10] 时在调用中连接它的 stdin =] 进程:给它一个文件,一个管道,或者在你自己的程序中把它连接到一个文件句柄。

也许您想使用 std::signal,例如:

void signal_handler(int signal)
{
    std::cout << "Received SIGTTIN signal\n";
}

int main()
{
    std::signal(SIGTTIN, signal_handler);
    ...
}

所以。经过两天的尝试和哭泣,我现在解决了这个问题。如果你想给你的子进程 SIGTTIN,你应该在父进程中调用 setpgid()。