簡體   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