我对/ 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没有相同的值。
有人有解释吗?
感谢。
答案 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_LEN
和task_struct
在include/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