在C中,在“后台模式”中调用检测程序的方法是什么? 我有一个程序,我想以交互方式或在后台启动。
我怎样才能检测到我不应该从stdin读取并以“Stopped:tty input”状态结束?
我应该测试stdin是否关闭?我怎么能这样做?
编辑: isatty似乎是一个好主意,但如果stdin是管道末端而不是tty会发生什么?
答案 0 :(得分:3)
使用控制终端文件描述符上的tcgetpgrp()
函数(例如STDIN_FILENO
或0表示stdin)来检查当前前台进程组是否等于您自己的进程组(来自{{ 3}})。但是,当您的程序在前景和后台之间移动时,前台进程组可能随时更改。例如,在您调用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 :(得分:1)
1)你应该检查stdin是否打开,如果关闭则打开/ dev / null。
2)您可以使用isatty
,如果desc是连接到终端的打开文件描述符,则返回1,否则返回0