进程名的最大长度是多少?我从/proc/[pid]/stat
文件中读取进程名,并想知道我需要的最大缓冲区大小。
我相信有一个可配置的限制,但我找不到它在哪里设置。
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个字符)。
ps -e -o comm
命令,导致所有进程名称都被截断(例如对于通常具有较长可执行文件名的akonadi资源)。 - David Faure