检测后台操作

时间:2009-09-21 16:00:54

标签: linux stdio

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

我怎样才能检测到我不应该从stdin读取并以“Stopped:tty input”状态结束?

我应该测试stdin是否关闭?我怎么能这样做?

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

2 个答案:

答案 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

相关问题