一个进程名字的最大允许长度是多少?

10

进程名的最大长度是多少?我从/proc/[pid]/stat文件中读取进程名,并想知道我需要的最大缓冲区大小。

我相信有一个可配置的限制,但我找不到它在哪里设置。

1个回答

20
根据man 2 prctl

PR_SET_NAME (自 Linux 2.6.9 起)

使用(char *) arg2指向的位置中的值设置调用线程的名称。名称最多可长达16个字节,如果包含较少字节,则应以空字符结尾。

因此,我会选择一个长度为16个字节的缓冲区。


编辑:

让我再更详细地解释一下。

Linux中的每个进程对应于内核中的struct task_struct,该结构在include/linux/sched.h中定义。

在此定义中,有一个字段char comm[TASK_COMM_LEN],根据注释,它是指不包括路径的可执行文件名称:

    char comm[TASK_COMM_LEN]; /* executable name excluding path
                                 - access with [gs]et_task_comm (which lock
                                   it with task_lock())
                                 - initialized normally by setup_new_exec */

它的大小为TASK_COMM_LEN,在同一头文件中被定义这里,为16字节

/* Task command name length */
#define TASK_COMM_LEN 16

此外,引用LDD3第22页的话:

...

通过访问struct task_struct中的某些字段,以下语句打印当前进程的进程ID和命令名称:

printk(KERN_INFO "The process is \"%s\" (pid %i)\n",
        current->comm, current->pid);

current->comm中存储的命令名是当前进程正在执行的程序文件的基本名称 (如果需要,则将其截断为15个字符)。


3
为什么内核开发人员会认为在现代将可执行文件名截短为16个字符是个好主意呢?这影响到了 ps -e -o comm 命令,导致所有进程名称都被截断(例如对于通常具有较长可执行文件名的akonadi资源)。 - David Faure
你知道有什么方法可以获取实际的命令名称吗,即使程序是一个bash或python脚本? - Antoine Viallon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接