线程名称:/proc/pid/comm 是否始终与 /proc/pid/status 的 Name: 行和 /proc/pid/stat 的第二个字段相同?

线程名称:/proc/pid/comm 是否始终与 /proc/pid/status 的 Name: 行和 /proc/pid/stat 的第二个字段相同?

Linux 线程或分叉进程可能会更改文件系统ps中可见的名称和/或其命令行/proc

使用该python-setproctitle包时,相同的更改发生在/proc/pid/cmdline/proc/pid/comm、和 的第二个字段中Name:,其中仅显示完整长度,其他三个位置显示更改名称的前 15 个字符。/proc/pid/status/proc/pid/statcmdline

当观察多线程ruby进程时,看起来/proc/pid/cmdline保持不变,但其他三个位置显示线程名称,被截断为 15 个字符。

man prctl告诉 是/proc/pid/comm由系统调用PR_SET_NAME的操作修改的prctl,但它没有说明关于/proc/pid/status和 的任何内容/proc/pid/stat

man proc/proc/pid/comm提供了一个超集,prctl PR_SET_NAME不再解释。
它表明即使进程被换出,第二个字段/proc/pid/stat仍然可用。

在观察 JVM 进程时,所有提到的位置都为所有线程提供了相同的内容(除了cmdlineall shown之外的三个位置java),但jcmd pid Thread.print仍然为现有线程显示不同的线程名称,因此看起来 Java 线程正在使用某种非标准机制来改变他们的名字。

的行和第二个字段始终/proc/pid/comm相同,或者是否存在这三个地方之一提供不同内容的情况? 如果可能存在差异,请提供一个(易于重现)示例。Name:/proc/pid/status/proc/pid/stat

答案1

所有三个条目都在内核源代码中紧密定义:comm,stat, 和status。从那里开始工作,comm由以下人员处理comm_show哪个调用proc_task_name确定任务的名称。stat由处理proc_tgid_stat,这是一个薄薄的包装纸do_task_stat, 哪个来电proc_task_name确定任务的名称。status由处理proc_pid_status,它还调用proc_task_name以确定任务的名称。

所以是的comm,“名称”行status和第二个字段stat都显示相同的值。唯一的变化是值是否被转义:status对其进行转义(替换特殊字符),其他则不转义。

相关内容