【问题标题】:psinfo_t solaris does not contain full process name in its fieldpsinfo_t solaris 在其字段中不包含完整的进程名称
【发布时间】:2016-03-09 09:50:30
【问题描述】:

在将 psinfo 数据文件 (/proc/%d/psinfo) 中的进程信息从 solaris 中的 procfs.h 读取到 struct psinfo_t 时,未在 psinfo_t 结构的字段 pr_fname 中获取完整的进程名称。

完整的 psinfo_t 结构定义在以下站点:

http://docs.oracle.com/cd/E19253-01/816-5174/6mbb98ui2/index.html

只有当进程名称小于等于 15 个字符时,我才会获得完整的进程名称,否则如果进程名称超过 15 个字符,那么我只会截断进程名称的前 15 个字符。

我使用的代码如下:

#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 二进制文件从哪里获取进程名称。

【问题讨论】:

    标签: c++ c unix solaris procfs


    【解决方案1】:

    psinfo_t 结构的 pr_fname 字段长度为 16 个字节,每个 the source code

    #define PRFNSZ      16  /* Maximum size of execed filename */
    

    所以实际上它会被截断为最多 15 个字符。

    您可以从/proc/PID/map 获取实际二进制文件的名称。对于 32 位进程,exec 的二进制文件将映射到地址 0x00010000

    如果您想查看ps 的源代码,您可以在http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/ps/ 上浏览它的数据。

    【讨论】:

    • 是否有一个预定义的结构,我可以在其中存储此地图文件的数据。
    • @mSatyam 它位于您在问题中链接的同一 proc.4 手册页上。
    • 我尝试将地图数据文件读入 prmap_t 结构,但是当我打印数据成员 pr_mapname 时,它​​是一个空字符串。你是不是想让我做别的事。我做得对吗?
    • 您是如何读取地图数据的?您几乎需要通过一个低级的read() 调用从/proc/pid/map 读取二进制prmap_t 结构。
    • 我阅读它的方式与阅读 psinfo 结构的方式相同。现在将尝试使用低级读取调用。
    【解决方案2】:

    Solaris 11.3 SRU 5 引入了包含完整命令名称的 /proc/&lt;pid&gt;/execname,因此您可以检查该文件是否存在并在存在时使用它,否则回退到有限的 pr_fname

    详情请见Solaris 11.3 SRU 5.6: updates in ps(1) and /proc/<pid>/{cmdline,environ,execname}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2023-04-07
      • 1970-01-01
      • 2015-01-12
      相关资源
      最近更新 更多