【发布时间】:2023-03-13 11:15:01
【问题描述】:
进程名称允许的最大长度是多少?我正在从/proc/[pid]/stat 文件中读取进程名称,我想知道我需要的最大缓冲区。
我很确定有一个可配置的限制,但就是找不到它在哪里。
【问题讨论】:
进程名称允许的最大长度是多少?我正在从/proc/[pid]/stat 文件中读取进程名称,我想知道我需要的最大缓冲区。
我很确定有一个可配置的限制,但就是找不到它在哪里。
【问题讨论】:
根据man 2 prctl:
PR_SET_NAME(自 Linux 2.6.9 起)
使用 (char *) arg2 指向的位置中的值设置调用线程的名称。 名称最长可达 16 个字节,如果包含的字节数较少,则应以 null 结尾。
所以我会选择 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在上面的同一个头文件here中定义为16字节:
/* Task command name length */
#define TASK_COMM_LEN 16
此外,引用 LDD3 第 22 页:
...
下面的语句打印当前的进程ID和命令名 通过访问
struct task_struct中的某些字段来处理:printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);
current->comm中存储的命令名是程序文件的基名 (根据需要修剪为 15 个字符)正在由当前进程执行。
【讨论】:
ps -e -o comm,它会截断所有进程名称(例如,对于 akonadi 资源,它们通常具有更长的可执行名称)。