【问题标题】:Change process name without changing argv[0] in Linux在 Linux 中更改进程名称而不更改 argv[0]
【发布时间】:2013-04-23 09:24:40
【问题描述】:

我需要用C语言修改我的程序的进程名。
我准确地说,这不是我要更改的线程的名称。
我想更改我的程序的名称,但我找到的唯一解决方案是修改 argv[0] 的值。
我还用prctl(PR_SET_NAME, "newname") 找到了另一个解决方案,但是这个解决方案不起作用。

【问题讨论】:

标签: c linux process rename argv


【解决方案1】:

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

  • 修改argv[0]更改/proc/$pid/cmdline中的信息
  • 调用prctl(PR_SET_NAME) 更改/proc/$pid/status 中的信息

这意味着您将获得发出ps -aps -ax 的进程的不同名称。

如果您在执行 ps 时希望不同的参数具有相同的进程名称,您可以同时执行它们(即更改 argv[0] 并调用 prctl)。

希望答案有所帮助。

【讨论】:

    【解决方案2】:

    试试这个:

    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 中使用它。 谢谢@ecerulm

    */

    【讨论】:

    • 我认为 \0 是不必要的 - 它不是已经默默地附加到文字字符串吗?
    • @Chap:strcpy 是这样,memcpy 不是这样。
    • 看来你必须覆盖原argv[0]的所有字符,是真的吗?所以你不能有比原始名称更大的进程名称
    • argv[0] 分配的空间可能小于您要提供的名称,然后您将覆盖其他一些不相关的内存。 argv[0] 大小可能只有 2,如果您的进程名称是“averylongprocessname”,您将溢出argv[0]。您需要 strlen(argv[0]) 并在 memcpy 中使用它。
    • \0 是不必要的。此外,sizeof 在这里不正确,因为它会返回指针的大小(通常为 4 或 8 个字节)。你想要的东西更像strncpy(argv[0], process_name, strlen(process_name)memcpy(argv[0], process_name, (strlen(argv[0]) < strlen(process_name)+1) ? strlen(argv[0]) : strlen(process_name)+1)
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多