修改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
相关产品推荐
相关产品推荐

