4

在 C 中,检测程序在“后台模式”中调用的方法是什么?我有一个程序我想以交互方式或在后台启动。

如何检测我不应该从标准输入读取并以“已停止:tty 输入”状态结束?

我应该测试标准输入是否关闭?我怎样才能做到这一点 ?

编辑: isatty 似乎是个好主意,但是如果 stdin 是管道端而不是 tty 会发生什么?

4

2 回答 2

3

使用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 */
}
于 2009-09-21T16:24:13.593 回答
1

1)您应该检查stdin是否打开,如果它关闭则打开/dev/null。

2)您可以使用isattywhich “如果 desc 是连接到终端的打开文件描述符,则返回 1,否则返回 0”

于 2009-09-21T16:14:13.367 回答