在psinfo数据文件(/ proc /%d / psinfo)中将进程信息从solaris中的procfs.h读取到struct psinfo_t时,未在psinfo_t struct的字段pr_fname中获取完整的进程名称。
完整的psinfo_t结构定义出现在以下网站上:
http://docs.oracle.com/cd/E19253-01/816-5174/6mbb98ui2/index.html
只有当进程名称小于等于15个字符时,如果进程名称超过15个字符,那么我将获得完整的进程名称,那么我只获得进程名称的前15个字符,其余字符将被截断。< / p>
我使用的代码如下:
#include <iostream>
#include <cstdlib>
#include <procfs.h>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
// get the pid from command line
int pid = atoi(argv[1]);
// create the pstatus struct from procfs
psinfo_t info;
char file[100];
sprintf(file, "/proc/%d/psinfo", pid);
ifstream in(file);
if (in)
{
in.read((char*)&info, sizeof(psinfo_t));
in.close();
cout << "My Name: " << info.pr_fname << endl;
}
else
{
cout << "Process Not Exists!" << endl;
}
return 0;
}
我是否必须从procfs文件系统中读取其他文件(psinfo除外)才能获得完整的进程名称。 此外,如果我从命令行使用belwo ps命令,那么我可以获得完整的进程名称:
ps -p 4970 -o comm
但我不想通过在我的代码中执行ps命令来获取进程名称。 我很好奇ps二进制文件在哪里获取进程名称。
答案 0 :(得分:2)
pr_fname
结构的psinfo_t
字段长度为16个字节,每个the source code:
#define PRFNSZ 16 /* Maximum size of execed filename */
因此它实际上会被截断为最多15个字符。
您可以从/proc/PID/map
获取实际二进制文件的名称。对于32位进程,exec'd二进制文件将映射到地址0x00010000
。
如果您想查看数据的位置,可以在http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/ps/浏览ps
的源代码。
答案 1 :(得分:2)
Solaris 11.3 SRU 5引入了/proc/<pid>/execname
,其中包含完整的命令名称,因此您可以检查该文件是否存在,如果存在则使用它,否则回退到有限的pr_fname
。
有关详细信息,请参阅Solaris 11.3 SRU 5.6: updates in ps(1) and /proc/<pid>/{cmdline,environ,execname}。