【问题标题】:Setting the thread /proc/PID/cmdline?设置线程/proc/PID/cmdline?
【发布时间】:2008-09-26 14:25:37
【问题描述】:

Linux/NPTL 上,线程被创建为某种进程。

我可以看到我的一些进程有一个奇怪的命令行:

cat /proc/5590/cmdline 
hald-addon-storage: polling /dev/scd0 (every 2 sec)

您知道如何为进程的每个线程执行此操作吗?这对调试很有帮助。

/me 现在正在研究 HAL 源

【问题讨论】:

    标签: linux multithreading debugging cmd nptl


    【解决方案1】:

    如果您想以可移植的方式执行此操作,并且可以跨多个 Unix 变体工作,那么可用的选项非常少。

    您需要做的是,您的调用者进程必须调用 exec,其中 argv [0] 参数指向您希望在进程输出中看到的名称,并且文件名指向实际的可执行文件。

    您可以使用以下命令在 shell 中尝试此行为:

    exec -a "This is my cute name" bash
    

    这会将当前的 bash 进程替换为一个名为 "This is my cute name" 的进程。

    要在 C 中执行此操作,您可以查看 sendmail 的源代码或任何其他已广泛移植的软件,并找到跨操作系统支持此功能所需的所有变体。

    有些操作系统有一个setproctitle(3) API,有些操作系统允许您覆盖argv [0] 的内容并显示该结果。

    【讨论】:

    【解决方案2】:

    argv 指向可写字符串。给他们写东西:

    #include <string.h>
    #include <unistd.h>
    
    int
    main(int argc, char** argv)
    {
        strcpy(argv[0], "Hello, world!");
        sleep(10);
        return 0;
    }
    

    【讨论】:

    • 很丑,但我想我会用它
    • 这可能是缓冲区溢出。特别是如果您的新字符串比原始字符串长。您可能最好在堆上分配一个新字符串并将其分配给 argv[0]
    • 不幸的是,分配给 argv[0] 没有任何作用。这确实是我的首选。
    • 是的,这绝对是缓冲区溢出。实现这一点的更严肃的方法(例如 util-linux 中的 setproctitle())实际上在覆盖之前将环境重新定位到安全的地方。
    【解决方案3】:

    呸..代码不是很好,诀窍是重用环境(这里是argv_buffer)指针:

    memset (argv_buffer[0] + len, 0, argv_size - len);
    argv_buffer[1] = NULL;
    

    有更好的主意吗?

    这适用于不同的线程吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多