【问题标题】:Why is the name of a process in /proc/PID/status not matching package name or ps command为什么 /proc/PID/status 中的进程名称与包名称或 ps 命令不匹配
【发布时间】:2012-12-20 00:11:44
【问题描述】:

我编写的本机应用程序使用 /proc/PID/status 名称变量。但是,状态文件中的 name 变量似乎不完整。例如,在测试时我打开了安卓计算器,从 PS 中查找了 PID,然后转到了对应的/proc/PID 文件夹。然后我cat状态文件看看

Name: oid.calculator

PS 命令显示com.android.calculatorpackages.xml 显示 com.android.calculator。我在其他几部手机上进行了测试(Razr Maxx 运行 4.0.4,Google Nexus 运行相同的操作系统版本)并注意到类似的行为。

【问题讨论】:

    标签: kernel process


    【解决方案1】:

    这取决于 Linux 内核特性:一个进程有两个不同的名称。

    • 其中一个名称是可执行文件路径的最后一个组成部分,例如native_executable 如果您的应用程序位于 /data/apps/com.example.hello/native_executable。这是出现在/proc/PID/statusName 字段中的名称。内核将其截断为 15 个字符,因此在本例中它包含 native_executab
    • 另一个名称由调用应用程序的程序作为其命令行参数#0(C 中的argv[0],Java 中的args[0])传递。这是出现在/proc/PID/cmdline 开头和ps 显示的名称。
    • 可执行文件的路径也是符号链接/proc/PID/exe的目标。

    按照惯例,当一个程序启动另一个程序时,它应该使用可执行文件的名称作为命令行参数 0,但它可以选择不这样做。 /proc/PID/statusName 字段始终被内核设置为可执行文件的(截断)名称。

    这是一个通用的 Linux 功能 - 另请参阅 Ask Ubuntu 上的 Can I use standard tools to get the full name of a process, when its name has embedded spaces?

    应用程序本身可以在之后更改这两个名称(尽管有长度限制)。 Dalvik 使用这种能力来区分应用程序:所有应用程序都源自同一个本机可执行文件/sytem/bin/app_process; VM 不会将它们都称为app_process,而是将这两个名称都更改为应用程序包名称。 /proc/PID/status 中的名称限制为 15 个字符,这就是它被截断的原因。您可以从/proc/PID/cmdline 获取更长的名称(读取到第一个空字节)。

    【讨论】:

    • 将名称截断为 15 个字符的原因是什么? (man proc 上的 TASK_COMM_LEN)。似乎是一个相当低的限制。
    • @PabloBianchi 它被截断以保持数据结构的恒定大小,这在内核中很重要。不知道为什么这么小。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2015-03-14
    • 2012-01-22
    • 2020-08-21
    • 2018-07-05
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多