解析proc/pid/cmdline以获取函数参数

And*_*ira 2 c++ linux procfs

我正在尝试使用cmdline中的数据提取调用应用程序的参数.

如果我启动这样的应用程序实例:

myapp 1 2

然后cat我myapp的cmdline我会看到类似myapp12的东西.

我需要提取这些值,并使用这段代码来完成它


pid_t proc_id = getpid();

sprintf(buf,"/proc/%i/cmdline",proc_id);

FILE * pFile;
pFile = fopen (buf,"r");
if (pFile!=NULL)
{
    fread(buf,100,100,pFile);
    cout << "PID " << proc_id << endl;
    string str = buf;
    cout << buf << endl;
    size_t found=str.find_last_of("/\\");
    cout << " file: " << str.substr(found+1) << endl;

    fclose (pFile);
}
Run Code Online (Sandbox Code Playgroud)

但我得到的只是应用程序名称,没有参数......


来自答案的更新:

好吧,我现在的问题似乎是如何在没有停在第一个NULL字符的情况下读取cmdline文件...

fopen(cmdline, "rb")
Run Code Online (Sandbox Code Playgroud)

没有做任何其他事情......

Pyp*_*ros 9

/usr/bin/strings /proc/1337/cmdline 通常为我做这份工作.


Ada*_*kin 7

所有命令行参数(作为argv[]数组将会出现的内容)实际上是以空值分隔的字符串/proc/XXX/cmdline.

abatkin@penguin:~> hexdump -C /proc/28460/cmdline
00000000  70 65 72 6c 00 2d 65 00  31 20 77 68 69 6c 65 20  |perl.-e.1 while |
00000010  74 72 75 65 00                                    |true.|
Run Code Online (Sandbox Code Playgroud)

这就解释了为什么当你cat"主编cmdline,它们都是'卡壳’在一起(cat忽略无效的NULL字符),为什么你cout停止了第一个命令行参数(进程名),因为它认为该进程名是一个空值终止字符串后在那一点上停止寻找更多角色.

处理命令行参数

要处理命令行参数,您有几个选项.如果您只想将整个命令行作为一个巨大的字符串,则从0循环到(numRead - 2)(其中numRead是读取的字符数)并(curByte == 0)用空格替换任何NULL字节.然后确保将最后一个字符也设置为NULL字节(如果由于固定大小的缓冲区导致事物被截断).

如果您想要一个包含所有参数的数组,则需要更具创造性.一个选项是从0循环到,(numRead - 1)并且可以找到您找到的所有NULL字节.然后分配一个char*长度为s 的数组.然后循环返回命令行,将每个字符串的开头(即数组中的第一个字节,加上NULL字节后的每个字节)设置为数组的连续元素char*.

只要知道,因为您读取固定大小的缓冲区,超出该缓冲区的任何内容都将被截断.所以请记住,无论你做什么,你可能需要手动确保最后一个字符串的末尾最终被NULL终止,否则大多数字符串处理函数将不知道字符串结束的位置并将继续永远.