在Linux/NPTL上,线程作为某种进程创建。我可以看到我的一些进程有一个奇怪的命令行:
cat /proc/5590/cmdline hald-addon-storage: polling /dev/scd0 (every 2 sec)
你知道我如何为进程中的每个线程都这样做吗?这对调试很有帮助。
qxgroojn1#
如果你想以一种可移植的方式来完成这件事,这将在多个Unix变体上工作,有很少的选项可用。您需要做的是,您的调用者进程必须使用argv [0]参数调用exec,该参数指向您希望在进程输出中看到的名称,而文件名指向实际的可执行文件。您可以使用以下命令从shell尝试此行为:
argv [0]
exec -a "This is my cute name" bash
这将用一个名为"This is my cute name"的bash进程替换当前的bash进程。要在C中实现这一点,您可以查看sendmail或任何其他已广泛移植的软件的源代码,并找到跨操作系统支持这一点所需的所有变体。有些操作系统有setproctitle(3) API,有些操作系统允许覆盖argv [0]的内容并显示结果。
"This is my cute name"
sendmail
setproctitle(3)
92vpleto2#
argv指向可写字符串。只需向其写入内容:
argv
#include <string.h> #include <unistd.h> int main(int argc, char** argv) { strcpy(argv[0], "Hello, world!"); sleep(10); return 0; }
l7wslrjt3#
呸...代码不是那么好,诀窍是重用environ(这里是argv_buffer)指针:
memset (argv_buffer[0] + len, 0, argv_size - len); argv_buffer[1] = NULL;
有更好的主意吗?这对不同的线程有效吗?
3条答案
按热度按时间qxgroojn1#
如果你想以一种可移植的方式来完成这件事,这将在多个Unix变体上工作,有很少的选项可用。
您需要做的是,您的调用者进程必须使用
argv [0]
参数调用exec,该参数指向您希望在进程输出中看到的名称,而文件名指向实际的可执行文件。您可以使用以下命令从shell尝试此行为:
这将用一个名为
"This is my cute name"
的bash进程替换当前的bash进程。要在C中实现这一点,您可以查看
sendmail
或任何其他已广泛移植的软件的源代码,并找到跨操作系统支持这一点所需的所有变体。有些操作系统有
setproctitle(3)
API,有些操作系统允许覆盖argv [0]
的内容并显示结果。92vpleto2#
argv
指向可写字符串。只需向其写入内容:l7wslrjt3#
呸...代码不是那么好,诀窍是重用environ(这里是argv_buffer)指针:
有更好的主意吗?
这对不同的线程有效吗?