从proc / pid / cmdline解析命令行参数

时间:2014-06-09 19:23:18

标签: c++

我尝试使用system()命令和模拟器{s}在我的程序中解析另一个程序(这是一个模拟器)的命令行参数{1}}。不幸的是同时使用文件读取和pid,输出格式不正确,所以我无法真正获得数据。命令行上的cat显示删除了空格的文件内容,整个字符串粘在一起,并使用cat,它只显示程序的名称(我猜的第一个参数)。任何人都有任何想法?

参数的格式如下:

ifstream

最终我需要显示与上面格式化相同的字符串。

以上是我到目前为止所做的:(sudo ./src/yse6 -w -f tracefiles/capacity.3Mbps_400RTT_PER_0.0001.txt -at=eth1 -an=eth0 获取命令,在命令行中运行它并将结果返回为ExecCommand()string尝试获取使用文件阅读器的文件内容。)

Secondary()

2 个答案:

答案 0 :(得分:5)

这样的东西,但有更多的错误检查,应该是一个好的开始(除了cout位,这比C ++更多C:

const int BUFSIZE = 4096; // should really get PAGESIZE or something instead...
unsigned char buffer[BUFSIZE]; // dynamic allocation rather than stack/global would be better

int fd = open("/proc/self/cmdline", O_RDONLY);
int nbytesread = read(fd, buffer, BUFSIZE);
unsigned char *end = buffer + nbytesread;
for (unsigned char *p = buffer; p < end; /**/)
{ cout << p << endl;
  while (*p++); // skip until start of next 0-terminated section
}
close(fd);

特别是,应检查open()read()的错误情况,但我没有显示该部分......在您的命令行为&gt;的极端情况下,这也可能会失败。 4096个字符长,或者由于某些其他原因,read()在一次调用中不读取文件,这在当前/proc实现中不应发生,但并不总是保证...

答案 1 :(得分:1)

一个简单的解决方法是读取字节,然后迭代以删除带有空格的空终止字符。这是一个基于 C 的实现。错误条件尚未检查。

char *name = (char *)malloc(MAX_SIZE);
char procfile[MAX_SIZE];
sprintf(procfile, "/proc/%d/cmdline", pid);
int fd = open(procfile, O_RDONLY);
int size = read(fd,name,sizeof(procfile));
close(fd);
for(int i = 0 ; i < size; i++){
 if(!name[i]) name[i] = ' ';
}