【问题标题】:What is the maximum allowed limit on the length of a process name?进程名称长度的最大允许限制是多少?
【发布时间】:2023-03-13 11:15:01
【问题描述】:

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

我很确定有一个可配置的限制,但就是找不到它在哪里。

【问题讨论】:

    标签: linux unix process procfs


    【解决方案1】:

    根据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 个字符)正在由当前进程执行。

    【讨论】:

    • 知道为什么内核开发人员认为在当今时代将可执行文件名称截断为 16 个字符是个好主意吗?这会影响ps -e -o comm,它会截断所有进程名称(例如,对于 akonadi 资源,它们通常具有更长的可执行名称)。
    • 您是否知道任何变通方法来获取实际命令名称,即使程序是 bash 或 python 脚本?
    猜你喜欢
    • 2018-08-06
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多