2012-09-07 122 views
2

在Linux平臺上,如果我在控制檯ps -p "pid" -o command中編寫代碼,我會在運行程序時獲得在終端中傳遞的所有參數的完整行。在控制檯中輸出如下:COMMAND gedit /home/sasha/Work/unloker/main.cpp (Ubuntu)。現在我正在編寫主要目的是獲得完整的輸入命令行的程序。我的C++代碼:如何獲得傳遞給正在運行的進程的命令行參數?

snprintf(path_cmdline, sizeof(path_cmdline), "/proc/%d/cmdline", pid); 
fd_cmdline = open(path_cmdline, O_RDONLY); 
if (fd_cmdline < 0) { 
} else { 
    char process_name[PATH_MAX]; 
    if (read(fd_cmdline, process_name, PATH_MAX) < 0) { 
    } else { 
    pid_info pid_t; 
    pid_t.pid=pid; 
    strcpy(pid_t.command_line,process_name); 
    strcpy(pid_t.process_name,basename(process_name)); 
    std::cout << pid_t << std::endl; 
    } 
} 

和我的財產以後的程序是這樣的輸出:10753 gedit gedit,但我怎樣才能得到完整的命令行作爲當ps -p "pid" -o command的輸出?

哪裏在/proc/%d/保持正在運行的程序的完整命令行?在Solaris系統中,我知道存在命令pargs哪些是我想要的,可能是現在怎麼找到這個命令的來源?

+1

我只是嘗試它和'/ proc中/%d/cmdline'了完全相同的信息的'ps -p 「PID」 -o command'。 – Ariel

+0

考慮使用/ proc/self/cmdline,這種方式當前的進程ID將不會被請求 –

回答

6

在參數/ proc/pid/cmdline是以0字節分隔的字符串列表。因此將它視爲以前面0字節結尾的C字符串,只會給出進程名稱。用空格替換全部0個字節,直到read返回的大小,然後重試。

這裏是證明:

$ hexdump -bc < /proc/32096/cmdline 
0000000 142 141 163 150 000 055 162 143 146 151 154 145 000 056 142 141 
0000000 b a s h \0 - r c f i l e \0 . b a 
0000010 163 150 162 143 000 
0000010 s h r c \0 
0000015 
+0

這是問題的答案。問題**已包括閱讀'/ proc/ /cmdline'.** –

+0

LoL,對不起,我沒有閱讀他的代碼,我跳過他的問題在底部。 – RobertMaysJr

+0

我upvoted你;-) – RobertMaysJr

1

在Linux中,正在運行的進程信息被存儲在/ proc /文件夾 -
的/ proc/{PROCESS_ID}/CMDLINE確切地說 - 例如這裏是鉻 -

$cat /proc/3193/cmdline 
/opt/google/chrome/chrome --type=renderer --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/ConnnectBackupJobs/ConnectBackupJobsEnabled/DnsImpact/default_enabled_prefetch/GlobalSdch/global_enable_sdch/IdleSktToImpact/idle_timeout_10/OmniboxDisallowInlineHQP/Standard/OmniboxSearchSuggest/6/Prerender/ContentPrefetchPrerender1/ProxyConnectionImpact/proxy_connections_32/SBInterstitial/V2/SpdyImpact/spdy3/UMA-Dynamic-Binary-Uniformity-Trial/default/UMA-Uniformity-Trial-1-Percent/group_31/UMA-Uniformity-Trial-10-Percent/group_05/UMA-Uniformity-Trial-20-Percent/default/UMA-Uniformity-Trial-5-Percent/group_13/UMA-Uniformity-Trial-50-Percent/group_01/WarmSocketImpact/warmest_socket/ --enable-crash-reporter=81A0480CAE65B69A53CE6E791EAA05A5,Ubuntu 10.10 --disable-client-side-phishing-detection --renderer-print-preview --disable-accelerated-2d-canvas --channel=2980.13.513987986 
+0

不,我用'貓',我包含了我在我的答案中使用的命令...... – RobertMaysJr

+0

對不起,我的意思是_terminal_ 。您的終端是否完全複製並粘貼?因爲我幾乎可以肯定(但無法驗證,因爲我現在正坐在Windows盒子前面)參數用NUL字節分隔。哪個會被'cat'複製,但是會被終端忽略,所以參數不會被空格分隔... –

+0

RobertMays​​Jr如何在c或C++代碼中獲得這行?如果我讀取/ proc/3193/cmdline只獲取進程名稱。 –

相關問題