2014.03
from http://www.ideawu.net/blog/archives/789.html
大家都知道, C 語言可執(zhí)行程序的入口是 main 函數(shù), main 函數(shù)的原型是這樣:
int main(int argc, char **argv);
編譯程序生成可執(zhí)行文件后, 從命令行運行, 參數(shù) argc 是指命令行參數(shù)的個數(shù)(包括程序本身), 而參數(shù) argv 則是所有參數(shù)字符串.
你有沒有想過, 為什么 argv 的類型是 char**, 而不是 const char** 呢? 難道 argv 的內(nèi)容也可以被修改? 沒錯! 命令行傳過來的參數(shù)是可以被修改的. 而修改后能帶來什么好處呢? 其實, 你可以通過修改 argv 來更改進程在 top/ps 中的顯示. 例如, 如果你的可執(zhí)行文件是 a.out, 那么你可以讓它在 top/ps 顯示成 abc, 也就是修改進程的名字.
可以看看下面的代碼:
#include<stdio.h>#include<string.h>int main(int argc, char **argv){ strcpy(argv[0], "hi!"); getchar(); return 0;}
把代碼保存為 a.c, 編譯并運行程序:
gcc a.c; ./a.out
這個程序會卡住, 這時, 你打開另一個命令行, 執(zhí)行 ps aux | grep a.out
, 你會找不到這個程序的進程. 如果執(zhí)行 ps aux | grep hi
, 進程就出現(xiàn)了.