C++ zsh/sh/bash如何检查命令的信号信号;cat&&引用;从c++;程序

C++ zsh/sh/bash如何检查命令的信号信号;cat&&引用;从c++;程序,c++,bash,signals,C++,Bash,Signals,我无法理解终端如何知道在后台模式下是否使用了二进制文件stdin 我有一个C++程序,它必须在后台运行代码,如代码>/bin /CAT//C>,但我没有得到错误信息: cat已停止,因为它使用了stdin并获得了SIGTTIN 原因是,此时,cat正在等待输入stdin,但您没有给它一个输入文件(通过,你必须确保在启动 CAT/COM>进程时调用它的代码> STDIN :给它一个文件,一个管道,或者将它连接到你自己的程序中的文件句柄。< /P> < P>也许你想用一个类似的东西: void si

我无法理解终端如何知道在后台模式下是否使用了二进制文件
stdin

我有一个C++程序,它必须在后台运行代码,如代码>/bin /CAT//C>,但我没有得到错误信息:

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


原因是,此时,
cat
正在等待输入
stdin
,但您没有给它一个输入文件(通过
或通过类似
echo foo | cat&
的管道),而且它没有作为
stdin
连接到您的终端,因为您将它放在后台,因此,当它试图从
stdin
读取时,它就得到了信号
sigtin
。由于交互终端在默认情况下启用了作业控制,因此终端会收到此通知,因此当后台作业在等待来自
stdin
的输入时暂停时,会弹出消息

如果你试图在C++程序中打开 CAT/COD>,你必须确保在启动<代码> CAT/COM>进程时调用它的代码> STDIN <代码>:给它一个文件,一个管道,或者将它连接到你自己的程序中的文件句柄。< /P> < P>也许你想用一个类似的东西:

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

int main()
{
    std::signal(SIGTTIN, signal_handler);
    ...
}
void信号处理器(int信号)
{

std::cout所以。经过两天的尝试和哭泣,现在我解决了这个问题。如果你想给你的孩子进程sigtin,你应该调用setpgid()这个问题是用C++来标记的,它是如何与编程相关的?@ ThomasSablik刚刚删除它——必须首先检查一个编辑。问题是,在这个时候,<代码> CAT/COD>等待输入“代码> STDIN < /Cord>,但是您没有给它输入文件(通过<代码> < <代码> >或管道)并且它没有以
stdin
的形式连接到您的终端,因此它在尝试从
stdin
读取数据时,会立即收到信号
SIGTTIN
。终端会收到此通知,因为交互终端默认启用作业控制,因此当它们在等待
stdin
的输入时,后台作业会被暂停,这个消息突然出现了。@ PaulvAsAn我使用C++标签,因为在这个时候我尝试创建一个应用程序。这个应用程序必须在后台运行/BI/CAT。给我的标签回!固定这个问题,所以C++连接是清楚的。请参见我的编辑,以确保我没有偏离你的实际意思。我没有这个信息的问题。我只想知道它在C++代码中是如何工作的,只是在底部添加了一个关于C++的注释。不,你不理解我。如果我在应用程序中运行/bin/CAT,它正常工作。但是我不会像TealAlh那样处理一个错误。好的。我想我现在就可以了。很抱歉,你把问题搞定了。我很高兴你把它修好了。这是一个更深的问题。顺便说一下,我把你的C++标签放回原处,顺便说一下,这是一个C++信号问题,但不是一个BASH。现在我得到你的问题,你似乎需要C++中的Bash风格的作业控制,我不知道该怎么做。我希望其他人能帮助你。你可能想编辑你的问题,使它更直接。在这一点上,类似于“我想以类似BASH的方式监视C++中的子进程”。