如何将命令行参数传递给正在运行的进程?

时间:2012-09-07 07:27:23

标签: c++ c linux shell unix

在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,它可以执行我想要的操作,现在我可能在哪里找到此命令的源代码?

2 个答案:

答案 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