改变argv [0]在Ubuntu中不起作用(C)

时间:2013-04-03 03:02:37

标签: c gcc ubuntu

所以我有这个在C运行时更改进程名称的任务,我偶然发现了这个问题:http://www.uofr.net/~greg/processname.html

现在在其他任何事情之前,我意识到改变argv [0]的危险(但是还有很长的路要走Linux和UNIX的东西)所以请不要讲它,我只是想知道为什么它没有在Ubuntu上工作。

以下是我使用的测试源:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(int argc, char *argv[]) {

    int argv0size = strlen(argv[0]);
    int onetwothree = 1;
    char* abc = (char *) malloc(sizeof(char) * (17 + 1));
    sprintf(abc,"ApplicationName%.3d",onetwothree); 
    strncpy(argv[0], abc ,argv0size);     
    getchar(); 
}

我只在Mac OS X和Ubuntu上进行了测试,它在Mac OS X上运行。我不知道为什么它不能用于Ubuntu。可能是什么原因导致它不起作用?

我正在使用gcc作为编译器。

2 个答案:

答案 0 :(得分:3)

  

所以我有这个在C运行时更改进程名称的任务,   我偶然发现了这个:   http://www.uofr.net/~greg/processname.html

我建议您使用的引用不是由操作系统或C的专家编写的。也许它适用于某些操作系统,但不需要在C中以这种方式工作。

  

在此之前,我意识到改变的危险   argv [0](但是还有很长的路要走Linux和UNIX的东西)所以   请不要讲它,我只是想知道它为什么不是   在Ubuntu工作。

正如WhozCraig在他的评论中所说,你当然可以修改argv数组,以及它所指向的数组。这并不意味着Ubuntu需要在其进程列表中使用该修改。

  

我在Mac OS X和Ubuntu上测试过它,它在Mac OS上运行   X.我不知道为什么它不能用于Ubuntu。可能是什么   可能的原因不起作用?

如果您正在寻找理由,请考虑滥用的可能性。如果在进程列表中使用了您自己的argv[0]副本,那么像kaiten这样的特洛​​伊木马程序将能够像过去那样伪造其进程名称,从而使它们更难以检测和删除。

答案 1 :(得分:2)

不幸的是,在C中并不能保证argv [0]实际上是进程名称。在Unix / Linux中,它可以是父进程选择使用的任意值(请参阅'execv / execve')。这意味着它不一定映射到进程名称,尽管它可能基于实现。

对于Ubuntu(可能还有MacOS?),以下内容应该更具普遍性:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __linux__
#include <sys/prctl.h>
#endif

void main(int argc, char *argv[]) {

  int argv0size = strlen(argv[0]);
  int onetwothree = 1;
  char* abc = (char *) malloc(sizeof(char) * (17 + 1));
  sprintf(abc,"ApplicationName%.3d",argv0size); 
  #ifdef __linux__
    prctl(PR_SET_NAME, abc, 0, 0, 0);
  #else
    strncpy(argv[0], abc ,argv0size);     
  #endif
  getchar(); 
}

编辑:删除了实际的应用程序名称 EDIT_2:OS X上没有prctl