我在Linux上,我正在分叉/从我的C衍生应用程序中释放一个新进程。是否也可以更改这些新的子进程的命名?在Linux中更改进程名称
我希望能够识别正在启动的进程,以防万一出现问题,我需要手动杀死它。目前他们都有相同的名字。
我在Linux上,我正在分叉/从我的C衍生应用程序中释放一个新进程。是否也可以更改这些新的子进程的命名?在Linux中更改进程名称
我希望能够识别正在启动的进程,以防万一出现问题,我需要手动杀死它。目前他们都有相同的名字。
我认为这应该工作,以说明原理...
#include <stdio.h>
int main(int argc, char *argv[]) {
argv[0][0] = 65;
sleep(10);
}
改个名字,并把一个“A”,而不是第一个字母。 CtrlZ暂停,然后运行ps
以查看更改的名称。我没有线索,但似乎有些危险,因为有些事情可能取决于argv[0]
。
此外,我试图将指针本身替换为另一个字符串;没有雪茄。所以这只适用于strcpy
以及比原始名称短或等于的字符串。
这可能有也可能没有更好的办法。我不知道。
编辑:nonliteral解决方案:如果你是分娩,你知道孩子的PID(getpid()
在孩子中,fork()
父母的结果)。只要将它输出到你可以阅读的地方,然后通过PID杀死孩子。
另一个nonliteral解决方案:使用另一个名称(ln -s a.out kill_this_a.out
)将软链接到可执行文件,然后当您执行时,执行该链接。该名称将是链接的名称。
感谢Amadan,+1这是一个聪明的想法。你之前尝试过吗?我的意思是,它可能会导致任何问题吗? – 2011-05-21 14:08:09
@Frank:这是支持的,如果你观察你的系统,你会发现一些程序。您受到现有参数大小的限制:您可以覆盖单个字符,不调整缓冲区大小或使用其他参数。 – Gilles 2011-05-21 14:16:31
有一些丑陋的黑客可以重复使用环境变量来获得额外的空间,参见例如[here](http://koders.com/c/fidE817FBB097E080657B0A6977E5F4C9612BC1E923.aspx?s=setproctitle.c)。使用最近的内核,你也可以执行'prctl(PR_SET_NAME,(unsigned long)“My Process”,0,0,0);' - 但并非所有实用程序都使用该名称作为默认显示名称(top does,ps不)它有16个字符的限制。 – nos 2011-05-21 14:24:47
以下代码示例会将进程的名称更改为“Testing”。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[]) {
char* temp = (char*) malloc (20);
strcpy(temp, "Testing");
temp[7] = 0;
printf("Argv[0] --> %s\n", argv[0]);
argv[0] = temp;
printf("Argv[0] --> %s\n", argv[0]);
return 0;
}
上述程序的输出是:
./a.out
的argv [0] - > ./a.out
的argv [0] - >测试
argv [0]包含进程的名称。
进程没有名称 – 2011-05-21 13:59:35
谢谢尼尔。当我查看系统监视器时,它确实向我显示了我所指的名称。然后我会用什么方法呢? – 2011-05-21 14:02:20
我怀疑这是创建该进程的可执行文件的文件名 - 您无法更改该文件。 – 2011-05-21 14:04:53