2011-05-21 145 views
18

我在Linux上,我正在分叉/从我的C衍生应用程序中释放一个新进程。是否也可以更改这些新的子进程的命名?在Linux中更改进程名称

我希望能够识别正在启动的进程,以防万一出现问题,我需要手动杀死它。目前他们都有相同的名字。

+8

进程没有名称 – 2011-05-21 13:59:35

+1

谢谢尼尔。当我查看系统监视器时,它确实向我显示了我所指的名称。然后我会用什么方法呢? – 2011-05-21 14:02:20

+0

我怀疑这是创建该进程的可执行文件的文件名 - 您无法更改该文件。 – 2011-05-21 14:04:53

回答

13

我认为这应该工作,以说明原理...

#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)将软链接到可执行文件,然后当您执行时,执行该链接。该名称将是链接的名称。

+1

感谢Amadan,+1这是一个聪明的想法。你之前尝试过吗?我的意思是,它可能会导致任何问题吗? – 2011-05-21 14:08:09

+2

@Frank:这是支持的,如果你观察你的系统,你会发现一些程序。您受到现有参数大小的限制:您可以覆盖单个字符,不调整缓冲区大小或使用其他参数。 – Gilles 2011-05-21 14:16:31

+7

有一些丑陋的黑客可以重复使用环境变量来获得额外的空间,参见例如[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

0

以下代码示例会将进程的名称更改为“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]包含进程的名称。