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我想要的命令,现在我可以在哪里找到该命令的来源?

4

2 回答 2

9

/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
于 2012-09-07T07:44:30.753 回答
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
于 2012-09-07T07:37:30.240 回答