1、prctl
一般在linux系统中可以选择用prctl系统调用来修改进程名称
示例:
#include <stdio.h>
#include <sys/prctl.h>
int main()
{
// 设置当前进程名为"example"
prctl(PR_SET_NAME, "example");
// 验证是否修改成功
char name[16];
prctl(PR_GET_NAME, name);
printf("process name is [%s]\n", name);
return 0;
}
运行结果:
process name is [example]
需要注意的一点是,它修改了/prco/pid/stat及/prco/pid/status中的进程名称,使用ps -A 或者top 命令看不到原来的进程名称,但未修改/prco/pid/cmdline 的值,使用ps -ef 、ps -aux可以看到原来的进程名及参数。
2、argv[0]
我们知道在一个程序中,参数的个数保存在int型argc中,参数保存在数组argv[]中,数组的第一个元素argv[0]保存的就是进程名,第二个元素argv[1]保存的是第一个参数,依次类推。通过修改进程argv[0]修改进程名,这一方法实现比较简单,我们只要在进程启动mian函数中修改掉argv数组所指向的内存空间的内容即可。当新名称比argv[0]小,我们可以直接修改,如下方示例。
当新名称比argv[0]长时比较复杂,需要先申请新内存保存环境变量信息和argv[1...argc-1]参数信息,然后再修改argv[0],将新名称往后到environ的最后一项清0,这个我们以后再讨论分享。
示例:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <cstring>
int main(int argc, char **argv)
{
printf("process running\n");
// 查看当前进程名
printf("process name is [%s]\n", argv[0]);
// 修改argv[0]参数
strncpy(argv[0], "name", 4);
// 查看修改后的进程名
printf("new process name is [%s]\n", argv[0]);
sleep(1);
return 0;
}
运行结果:
process running
process name is [./example]
new process name is [name]
与prctl不同的一点是,使用ps -ef 、ps -aux看不到进程名及参数了,但这种方法仅仅是修改了/prco/pid/cmdline 的值,使用ps -A 或者top 命令还是可以看到原来的进程名。