【发布时间】:2009-09-21 16:00:54
【问题描述】:
在 C 中,检测程序在“后台模式”中调用的方法是什么? 我想以交互方式或在后台启动一个程序。
如何检测我不应该从标准输入读取并以“已停止:tty 输入”状态结束?
我应该测试标准输入是否关闭?我该怎么做?
编辑: isatty 似乎是个好主意,但如果 stdin 是管道端而不是 tty 会发生什么?
【问题讨论】:
在 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,它“如果 desc 是连接到终端的打开文件描述符,则返回 1,否则返回 0”
【讨论】: