在 C 中,检测程序在“后台模式”中调用的方法是什么?我有一个程序我想以交互方式或在后台启动。
如何检测我不应该从标准输入读取并以“已停止:tty 输入”状态结束?
我应该测试标准输入是否关闭?我怎样才能做到这一点 ?
编辑: isatty 似乎是个好主意,但是如果 stdin 是管道端而不是 tty 会发生什么?
使用tcgetpgrp()
控制终端的文件描述符上的函数(例如STDIN_FILENO
,标准输入为 0)来检查当前前台进程组是否等于您自己的进程组(来自getpgrp()
)。但是,前台进程组可能随时更改,因为您的程序在前台和后台之间移动。例如,它可能会在您调用之后tcgetpgrp()
和测试之前立即更改。因此,如果您要基于此采取任何行动,请记住这一点;这不是一种可靠的避免方法SIGTTIN
。
#include <unistd.h>
pid_t fg = tcgetpgrp(STDIN_FILENO);
if (fg == -1) {
/* stdin is not controlling terminal (e.g. file, pipe, etc.) */
} else if (fg == getpgrp()) {
/* foreground */
} else {
/* background */
}
1)您应该检查stdin是否打开,如果它关闭则打开/dev/null。
2)您可以使用isatty
which “如果 desc 是连接到终端的打开文件描述符,则返回 1,否则返回 0”