【问题标题】:Detecting background operation检测后台操作
【发布时间】:2009-09-21 16:00:54
【问题描述】:

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

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

我应该测试标准输入是否关闭?我该怎么做?

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

【问题讨论】:

    标签: linux stdio


    【解决方案1】:

    在控制终端的文件描述符上使用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 */
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-18
        • 2016-07-17
        • 1970-01-01
        • 1970-01-01
        • 2013-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多