8

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

Name: oid.calculator

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

4

1 回答 1

15

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

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

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

这是一个通用的 Linux 功能 — 另请参阅我可以使用标准工具来获取进程的全名,当它的名称嵌入空格时?问 Ubuntu上。

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

于 2013-01-04T18:59:39.650 回答