2011-05-21 79 views
18

我在Linux上,我正在分叉/從我的C衍生應用程序中釋放一個新進程。是否也可以更改這些新的子進程的命名?在Linux中更改進程名稱

我希望能夠識別正在啓動的進程,以防萬一出現問題,我需要手動殺死它。目前他們都有相同的名字。

+8

進程沒有名稱 – 2011-05-21 13:59:35

+1

謝謝尼爾。當我查看系統監視器時,它確實向我顯示了我所指的名稱。然後我會用什麼方法呢? – 2011-05-21 14:02:20

+0

我懷疑這是創建該進程的可執行文件的文件名 - 您無法更改該文件。 – 2011-05-21 14:04:53

回答

13

我認爲這應該工作,以說明原理...

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    argv[0][0] = 65; 
    sleep(10); 
} 

改個名字,並把一個「A」,而不是第一個字母。 CtrlZ暫停,然後運行ps以查看更改的名稱。我沒有線索,但似乎有些危險,因爲有些事情可能取決於argv[0]

此外,我試圖將指針本身替換爲另一個字符串;沒有雪茄。所以這隻適用於strcpy以及比原始名稱短或等於的字符串。

這可能有也可能沒有更好的辦法。我不知道。

編輯:nonliteral解決方案:如果你是分娩,你知道孩子的PID(getpid()在孩子中,fork()父母的結果)。只要將它輸出到你可以閱讀的地方,然後通過PID殺死孩子。

另一個nonliteral解決方案:使用另一個名稱(ln -s a.out kill_this_a.out)將軟鏈接到可執行文件,然後當您執行時,執行該鏈接。該名稱將是鏈接的名稱。

+1

感謝Amadan,+1這是一個聰明的想法。你之前嘗試過嗎?我的意思是,它可能會導致任何問題嗎? – 2011-05-21 14:08:09

+2

@Frank:這是支持的,如果你觀察你的系統,你會發現一些程序。您受到現有參數大小的限制:您可以覆蓋單個字符,不調整緩衝區大小或使用其他參數。 – Gilles 2011-05-21 14:16:31

+7

有一些醜陋的黑客可以重複使用環境變量來獲得額外的空間,參見例如[here](http://koders.com/c/fidE817FBB097E080657B0A6977E5F4C9612BC1E923.aspx?s=setproctitle.c)。使用最近的內核,你也可以執行'prctl(PR_SET_NAME,(unsigned long)「My Process」,0,0,0);' - 但並非所有實用程序都使用該名稱作爲默認顯示名稱(top does,ps不)它有16個字符的限制。 – nos 2011-05-21 14:24:47

0

以下代碼示例會將進程的名稱更改爲「Testing」。

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 

    int main (int argc, char *argv[]) { 
    char* temp = (char*) malloc (20); 
    strcpy(temp, "Testing"); 
    temp[7] = 0; 
    printf("Argv[0] --> %s\n", argv[0]); 
    argv[0] = temp; 
    printf("Argv[0] --> %s\n", argv[0]);  
    return 0; 
    } 

上述程序的輸出是:

./a.out

的argv [0] - > ./a.out

的argv [0] - >測試

argv [0]包含進程的名稱。