C++修改进程名

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 命令还是可以看到原来的进程名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值