繁体   English   中英

C/C++ 进程如何知道它是否在后台运行?

[英]How can a C/C++ process know if it runs in background?

我的进程中有一个方法,只有当进程不在后台时才应该运行。 如何动态测试当前进程是否在后台? 谢谢

这是我使用的,用于从具有作业控制的外壳启动的程序(大多数外壳,见下文):

/* We can read from stdin if :
 * - we are in foreground
 * - stdin is a pipe end
 */
static int validate_stdin(void) {
    pid_t fg = tcgetpgrp(STDIN_FILENO);
    int rc = 0;
    if(fg == -1) {
        debug_printf("Piped\n");
    }  else if (fg == getpgrp()) {
        debug_printf("foreground\n");
    } else {
        debug_printf("background\n");
        rc = -1;
    }
    return rc;
}

如果会话有控制终端,则前台只能有进程组,tcget/setpgrp 用于设置该进程组ID。 因此,如果您的进程组 ID 不是前台进程组的进程组 ID,那么您不在前台。

正如 mouviciel 指向的链接所说,如果 shell 具有作业控制,它就可以工作。 然而,情况并非总是如此。 例如,在使用busybox 的嵌入式系统上,shell 可以配置有或没有作业控制。

查看 Unix 常见问题解答:进程如何检测它是否在后台运行?

一般的答案是:您无法判断自己是否在后台运行。

但是您可以检查 stdin 是否为终端: if(isatty(0)) { ... }

尝试检查 DISPLAY 的可用性。 那里显示了xset命令的源代码如何检查 Linux 控制台屏幕保护程序是否有黑屏

这听起来像一个糟糕的设计。 你能告诉我们你在问题中提到的这种方法吗? 正如mouviciel所说,没有可靠的方法。

我的一个建议是默认使用“前台行为”,并将“后台行为”保留在-d (用于守护程序模式)之类的开关下,反之亦然,如果您的程序通常在后台运行。 这种用法的一个例子是fetchmail

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM