我在Linux上,我正在分叉/從我的C衍生應用程序中釋放一個新進程。是否也可以更改這些新的子進程的命名?在Linux中更改進程名稱
我希望能夠識別正在啓動的進程,以防萬一出現問題,我需要手動殺死它。目前他們都有相同的名字。
我在Linux上,我正在分叉/從我的C衍生應用程序中釋放一個新進程。是否也可以更改這些新的子進程的命名?在Linux中更改進程名稱
我希望能夠識別正在啓動的進程,以防萬一出現問題,我需要手動殺死它。目前他們都有相同的名字。
我認爲這應該工作,以說明原理...
#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
)將軟鏈接到可執行文件,然後當您執行時,執行該鏈接。該名稱將是鏈接的名稱。
感謝Amadan,+1這是一個聰明的想法。你之前嘗試過嗎?我的意思是,它可能會導致任何問題嗎? – 2011-05-21 14:08:09
@Frank:這是支持的,如果你觀察你的系統,你會發現一些程序。您受到現有參數大小的限制:您可以覆蓋單個字符,不調整緩衝區大小或使用其他參數。 – Gilles 2011-05-21 14:16:31
有一些醜陋的黑客可以重複使用環境變量來獲得額外的空間,參見例如[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
以下代碼示例會將進程的名稱更改爲「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]包含進程的名稱。
進程沒有名稱 – 2011-05-21 13:59:35
謝謝尼爾。當我查看系統監視器時,它確實向我顯示了我所指的名稱。然後我會用什麼方法呢? – 2011-05-21 14:02:20
我懷疑這是創建該進程的可執行文件的文件名 - 您無法更改該文件。 – 2011-05-21 14:04:53