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()。
我不明白终端如何知道是否在后台模式下使用了二进制文件stdin
?
我有一个 C++ 程序,它必须在后台 运行 命令,如 /bin/cat
,但我没有收到错误消息:
cat
is stopped because it usedstdin
and gotSIGTTIN
原因是此时 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()。