代码之家  ›  专栏  ›  技术社区  ›  shodanex

正在检测后台操作

  •  4
  • shodanex  · 技术社区  · 16 年前

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

    如何检测我不应该从stdin读取并以“stopped:tty input”状态结束?

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

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   mark4o    16 年前

    使用 tcgetpgrp() 控制终端文件描述符上的函数(例如 STDIN_FILENO 或者对于stdin为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
  •   Douglas Leeder    16 年前

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

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

    推荐文章