2013-04-23 75 views
8

我需要用C語言來修改我的程序的進程名稱。
我確切地說,這不是我想改變的線程的名稱。
我想改變我的程序的名稱,但我發現唯一的解決辦法,就是修改的argv[0]值。
我還發現了prctl(PR_SET_NAME, "newname")的另一個解決方案,但此解決方案無效。改革進程名稱[0]在Linux中

+0

可能重複[如何命名在Linux下一個線程?](http://stackoverflow.com/questions/778085/how-to-name-a-thread-in -linux) – sehe 2013-04-23 09:33:38

+0

_「的文件說PR_SET_NAME設置進程的名稱,但該文檔是錯誤的 - 它實際上是設置線程的名字現在。‘頂’和‘PS -L _ - [user9876’顯示線程的名字。」年04月22 '09在17時39分](http://stackoverflow.com/questions/778085/how-to-name-a-thread-in-linux#comment588964_778124) – sehe 2013-04-23 09:34:13

+2

因爲Linux 2.6.9 – akhil 2013-04-23 09:55:37

回答

16

調用prctl和修改argv[0]之間的差異是:

  • 修改argv[0]/proc/$pid/cmdline
  • 調用prctl(PR_SET_NAME)改變信息改變/proc/$pid/status

信息,這意味着你將得到的差異名字你處理髮行ps -aps -ax

如果您在執行ps時期望不同參數的進程名稱相同,則可以同時執行它們(即更改argv[0]並調用prctl)。

希望的答案幫助。

-1

試試這個:

char *process_name = "aaa\0"; 
memcpy((void *)argv[0], process_name, sizeof(process_name)); 

/* 解釋: 分配給argv的空間[0]可能比你想給的名字更小,那麼你將被overwritting一些其他無關的記憶。 argv [0]大小可能僅爲2,如果進程名稱爲「averylongprocessname」,則會溢出argv [0]。你需要strlen(argv [0])並在memcpy中使用它。 THX @ecerulm

*/

+1

我PR_SET_NAME標誌被支撐認爲\ 0是不必要的 - 是不是已經悄悄地追加到字符串的字符串? – Chap 2014-04-30 04:09:29

+0

@Chap:'strcpy'不是'memcpy'。 – 2014-09-01 18:06:44

+1

似乎你必須覆蓋所有來自'argv [0]'的字符,這是真的嗎?所以你不能擁有比原名更大的進程名稱 – 2015-02-24 10:05:01