在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
,它可以执行我想要的操作,现在我可能在哪里找到此命令的源代码?
答案 0 :(得分: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
答案 1 :(得分:1)
在linux中,正在运行的进程信息存储在/ proc /文件夹中 -
/ proc / {PROCESS_ID} / cmdline是准确的 - 例如这里是chrome -
$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