2010-10-15 83 views
2

我在我的過程中有一個方法,只有當過程不在後臺時才應該運行。 如何動態測試當前進程是否在後臺? 謝謝C/C++過程如何知道它是否在後臺運行?

+3

當你說「背景」時,你的意思是在* nix過程意義上,還是在GUI意義上? – 2010-10-15 08:23:27

+0

你對標題的措辭對我沒有意義。 C和C++是編程語言,而不是unix進程的屬性。 – 2010-10-15 09:02:49

回答

2

退房Unix的常見問題的源代碼:How can a process detect if it's running in the background?

一般的回答是:如果你在後臺運行,則不能告訴。

但你可以檢查標準輸入是一個終端:if(isatty(0)) { ... }

+0

從您的鏈接中,一般的答案是否取決於您是否擁有職位控制的外殼。如今,這是一種相當標準的行爲。 – shodanex 2010-10-15 09:09:39

+0

由於我爲嵌入式系統工作,我從不認爲它是理所當然的。但在一般情況下,你是對的。 – mouviciel 2010-10-15 09:12:41

+0

謝謝,它的工作原理。 – cedrou 2010-10-15 09:45:34

4

以下是我使用,從作業控制一個shell啓動的程序(大部分外殼,見下文):

/* 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。因此,如果您的進程組標識不是前臺進程組的進程組標識,那麼您不在前臺。

如果shell具有作業控制,就像mouviciel指出的鏈接所說的那樣。 但是,情況並非總是如此。例如,在使用busybox的嵌入式系統上,可以使用或不使用作業控制來配置shell。

0

這聽起來像一個糟糕的設計。你能告訴我們關於你在問題中提到的這種方法嗎?正如mouviciel所說,沒有可靠的方法。

我的一個建議是默認使用「前景行爲」,如果您的程序通常在後臺運行,則在類似-d(對於守護程序模式)的開關下保留「背景行爲」,反之亦然。這種用法的一個例子是fetchmail

+0

爲什麼是-1?爲什麼人們會這樣做而不說爲什麼?它有助於知道。 – 2010-10-15 11:34:11

相關問題