You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改argv后/proc/pid/cmdline未同步更新,此行为是否正常?

修改argv后/proc/[pid]/cmdline未更新是正确行为吗?

我尝试修改进程的argv值后,查看/proc/[pid]/cmdline的内容,发现更新的值并未生效。测试代码如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char*argv[])
{
    if (argc < 2) {
        printf("Usage: %s arg1 arg2 ..\n", argv[0]);
        return 1;
    }
    printf("PID:%d\n", getpid());
    //Print the original arguments
    for (int i=0; i < argc; i++) {
        printf("argv[%d]:%s\n", i, argv[i]);
    }

    getchar();
    printf("Modifying arguments\n");
    argv[0] = "Hello";
    argv[1] = "123" ;
    for (int i=0; i < argc; i++) {
        printf("argv[%d]:%s\n", i, argv[i]);
    }
    getchar();

    return 0;
}

这是完全正确的行为,原因如下:

  • /proc/[pid]/cmdline读取的是进程启动时内核保存的原始命令行参数副本,这个副本在进程整个生命周期内都不会被用户态的修改操作更新。
  • 代码中修改的是用户态内存里的argv指针数组,只是改变了进程内部对参数的引用,并没有同步到内核维护的原始命令行数据结构中。
  • 内核不会跟踪用户态中argv的修改,因为argv本质上是进程地址空间内的用户数据,内核没有义务也不会主动去更新它保存的启动时副本。

如果想要让/proc/[pid]/cmdline显示修改后的内容,常规方法无法实现;prctl(PR_SET_NAME, ...)只能修改进程名,无法修改完整的cmdline内容;一些直接修改内核相关结构的非常规手段需要特权且风险极高,不推荐使用。

内容的提问来源于stack exchange,提问作者md.jamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:27:12