文件名在/ proc / pid / stat中的奇怪行为

时间:2015-12-14 15:40:04

标签: c debian

我对/ proc / pid / stat中的filename值有一个奇怪的行为。

我的程序名称是“test_dev”,当我用“./test_dev”执行它并且我查看/ proc / pid / stat时,我看到“pid(test)....”。 在/ proc / pid / status中相同。

我将“test_dev”更改为“testdev”以查看下划线是否是此混乱的罪魁祸首,但同样的事情再次出现。

我是printf argv [0],我正确地看到“test_dev”(或“testdev”)。

我想知道stat中的字段是如何设置的,以及为什么它不完整,因为/ proc的人说这是可执行文件的文件名。

我想一点,我想知道Eclipse是否可能是罪魁祸首。 这个EDI有时给我一些惊喜,如果再次出现这种情况我也不会感到惊讶,即使它确实让我感到烦恼的是argv [0]和/ proc / pid / stat没有相同的值。

有人有解释吗?

感谢。

2 个答案:

答案 0 :(得分:1)

  

然而,没有" _dev"的实际文件名;是15个字符长,和   " comm"字段似乎被内核限制为15个字符长   ...所以,文件名在/ proc / pid / stat中被截断,...我在哪里可以   找到这种文件?

不幸的是,这似乎没有很好地记录在人们期望的地方,但在proc手册页上有一些提示。

       /proc/[pid]/comm (since Linux 2.6.33)
              …  Strings longer than TASK_COMM_LEN (16) characters are silently truncated.
       /proc/[pid]/stat
              Status information about the process.  This is used by ps(1).
              It is defined in the kernel source file fs/proc/array.c.

TASK_COMM_LENtask_structinclude/linux/sched.h中定义:

#define TASK_COMM_LEN           16
…
struct task_struct {
…
    char                comm[TASK_COMM_LEN];

您观察的15个字符与此处的16个字符之间的差异是由于终止'\0'

答案 1 :(得分:0)

你提到的/ proc / pid / stat中的字段不显示argv [0],而是显示执行的命令。也许,eclipse将文件编译为名为" test"的可执行文件。并执行它。

这个例子:

execl("foo", "bar", "baz", NULL);

有一个" foo" (/ proc / pid / stat中的东西)," bar"的argv [0];和" baz"作为argv [1]

要仔细检查,您可能会尝试拨打您的程序" xxxxx"并且看,如果它仍然被命名"测试"在/ proc / pid / stat