C 在Linux中更改进程名称而不更改argv[0]

C 在Linux中更改进程名称而不更改argv[0],c,linux,process,rename,argv,C,Linux,Process,Rename,Argv,我需要用C语言修改程序的进程名。 我很精确,这不是我要更改的线程的名称。 我想更改程序的名称,但我找到的唯一解决方案是修改argv[0] 我还找到了另一个使用prctl(PR\u SET\u NAME,“newname”)的解决方案,但是这个解决方案不起作用。调用prctl和修改argv[0]之间的区别是: 修改argv[0]更改/proc/$pid/cmdline中的信息 调用prctl(PR\u SET\u NAME)更改/proc/$pid/status 这意味着您将获得发出ps-a和

我需要用C语言修改程序的进程名。
我很精确,这不是我要更改的线程的名称。
我想更改程序的名称,但我找到的唯一解决方案是修改
argv[0]


我还找到了另一个使用
prctl(PR\u SET\u NAME,“newname”)
的解决方案,但是这个解决方案不起作用。

调用
prctl
和修改
argv[0]
之间的区别是:

  • 修改
    argv[0]
    更改
    /proc/$pid/cmdline中的信息
  • 调用
    prctl(PR\u SET\u NAME)
    更改
    /proc/$pid/status
这意味着您将获得发出
ps-a
ps-ax
的进程的不同名称

如果在执行ps时不同的参数需要相同的进程名,则可以同时执行这两个操作(即更改
argv[0]
和调用
prctl

希望答案有帮助。

试试这个:

char *process_name = "aaa\0";
memcpy((void *)argv[0], process_name, sizeof(process_name));
/* 解释: 为argv[0]分配的空间可能小于您要指定的名称,然后您将覆盖其他一些不相关的内存。argv[0]大小可能只有2,如果进程名为“averylongprocessname”,则argv[0]将溢出。您需要strlen(argv[0])并在memcpy中使用它。 thx@ecerulm


*/

可能重复“文档中说PR_SET_NAME设置进程名称;但该文档是错误的-它确实设置了线程名称。现在“top”和“ps-L”显示线程名称。”--PR_SET_NAME标志是受Linux 2.6.9支持的。我认为\0是不必要的-它不是已经悄悄地附加到一个文字字符串中了吗?@Chap:strcpy是这样的,memcpy不是这样的。似乎你必须覆盖所有原始字符
argv[0]
,是这样吗?因此,进程名称不能大于原始名称分配给
argv[0]
的空间可能小于您想要给出的名称,然后您将覆盖其他一些不相关的内存
argv[0]
size可能仅为2,如果进程名为“averylongprocessname”,则会溢出
argv[0]
。您需要
strlen(argv[0])
并在
memcpy
中使用它。
\0
是不必要的。另外,
sizeof
在这里是不正确的,因为它将返回指针的大小(通常为4或8字节)。您需要更像
strncpy(argv[0]、进程名称、strlen(进程名称)
memcpy(argv[0]、进程名称、(strlen(argv[0])