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



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

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

cat停止了,因为它使用了stdin并得到了SIGTTIN

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

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

如果您尝试从C++程序在后台打开cat,则必须确保在启动cat过程时在调用中连接其stdin:为其提供文件、管道或将其连接到您自己的程序中的文件句柄。

也许你想使用一个std::signal,比如:

void signal_handler(int signal)
{
std::cout << "Received SIGTTIN signaln";
}
int main()
{
std::signal(SIGTTIN, signal_handler);
...
}

最新更新