所以我有这个在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作为编译器。
答案 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