2010-09-21 38 views
5

當您輸入「ps aux」時,ps命令會顯示程序運行的命令參數。有些程序將此作爲指示狀態的一種方式進行更改。我試過改變argv []字段,它似乎不工作。有沒有一種標準的方式來設置命令行參數,以便在用戶鍵入ps時顯示它們?如何在C程序中設置命令行參數,以便在用戶輸入「ps aux」時可見?

也就是說,這不起作用:

int main(int argc,char **argv) 
{ 
    argv[0] = "Hi Mom!"; 
    sleep(100); 
} 

09:40 imac3:~$ ./x & 
[2] 96087 
09:40 imac3:~$ ps uxp 96087 
USER  PID %CPU %MEM  VSZ RSS TT STAT STARTED  TIME COMMAND 
yv32  96087 0.0 0.0 2426560 324 s001 S  9:40AM 0:00.00 ./x 
09:40 imac3:~$ cat x.c 
+0

我認爲ythis是某種稱爲「bash選項卡擴展」的東西。您需要爲您的程序定義一個選項卡擴展處理程序,並將其註冊到某個文件中,但不要問我該如何執行此操作。 – fuz 2010-09-21 13:46:12

+0

不可能? (http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC22)你可能也喜歡(http://www.netsplit.com/2007/01/10/hiding-arguments-from- ps /) – pmg 2010-09-21 13:54:30

回答

5

你有正確的想法,但你不改變指針argv[n],必須更改指向的字符串argv[0]本身:

#include <string.h> 
#include <unistd.h> 

int main(int argc,char **argv) 
{ 
    size_t maxlen = strlen(argv[0]); 

    memset(argv[0], 0, maxlen); 
    strncat(argv[0], "Hi Mom!", maxlen); 
    pause(); 

    return 0; 
} 

(請注意,無論是否這實際上改變由ps所示的命令名是依賴於系統的)。

+0

'strncat'非常奇怪的使用...... – 2010-09-21 14:31:57

+0

@R ..:不,它不是。結合'strlen',@caf正在仔細觀察,我們可能無法保證比原始的'argv [0]'有更多的空間來存儲我們的程序名稱。另外,'memset'不是必需的,'strncat'將始終爲空終止。很乾淨的答案,很好的使用'暫停()'。 – 2010-09-21 16:14:27

+0

再看一遍。 'strncat'被用來連接到一個零長度的字符串,即作爲一個廉價的'strlcpy'而不是實際的連接。 'memset'是不必要的,但你至少需要'argv [0] [0] = 0;'來代替它所需的功能。這種非顯而易見的原因是我說這很奇怪。 – 2010-09-21 17:06:03