我不明白终端如何知道在后台模式下使用的二进制是否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);
...
}