首页 > 系统相关 >Linux 进程名修改

Linux 进程名修改

时间:2023-02-17 20:57:52浏览次数:53  
标签:gtc last argv char 修改 environ Linux 进程 os

/* 进程名修改 */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

/*
知识补充:
    Linux C中environ 变量是一个char** 类型,存储着系统的环境变量。
    因为environ是一个全局的外部变量,所以切记使用前要用extern关键字进行声明,然后在使用。
    unistd.h头文件中声明了这个变量,所以也可以将unistd.h进行include,这个时候就不用再对environ进行extern声明了(应为unistd.h中已经声明了),
    要注意的问题是,在unistd.h中声明environ的地方使用了条件编译,编译的条件就是#ifdef __USE_GNU,LinuxC中默认没有定义这个宏,
    所以要在#include <unistd.h>之前加上#define __USE_GNU
*/

extern char** environ;

/*
知识补充:
    在linux上修改进程名需要设置argv[1]为NULL,并且拷贝进程名到argv[0]指向的内存空间上。
    然而argv[0]的内存空间可能不够存放新的进程名,幸运的是Linux存储argv[] and environ[]用的是一块连续内存。
    因此我们可以分配一块新内存拷贝environ[],之后我们就可以安全的拷贝进程名到argv[0]上了。
*/

static char* gtc_os_argv_last;

int gtc_init_setproctitle(char* argv[])
{
    int ret = 0;

    /*
    设计说明:
        初始化是为了保证修改进程名的安全,
        gtc_os_argv_last变量实际上是指向当前进程可以修改进程名的最大长度
    */
    unsigned char    * p;
    size_t             size;
    unsigned int       i;

    size = 0;

    // 计算环境变量的长度
    for (i = 0; environ[i]; i++) {
        size += strlen(environ[i]) + 1;
    }

    // 创建内存,用来保存当前进程的环境变量
    p = calloc(1, size);
    if (NULL == p)
    {
        ret = -1;
        return ret;
    }

    // 从命令行参数开始计数
    gtc_os_argv_last = argv[0];

    for (i = 0; argv[i]; i++) {
        // 遍历命令行参数
        if (gtc_os_argv_last == argv[i]) {
            // gtc_os_argv_last指向下一个命令行参数
            gtc_os_argv_last = argv[i] + strlen(argv[i]) + 1;
        }
    }

    // 遍历环境变量
    for (i = 0; environ[i]; i++) {
        if (gtc_os_argv_last == environ[i]) {

            size = strlen(environ[i]) + 1;
            gtc_os_argv_last = environ[i] + size;

            strncpy((char*)p, environ[i], size);
            // 修改environ的元素指向,原来environ的元素可能会被 gtc_setproctitle 函数破坏
            environ[i] = (char*)p;
            p += size;
        }
    }

    // 保留最后一个字节为'\0'
    gtc_os_argv_last--;

    return ret;
}


void gtc_setproctitle(const char* title, char* argv[])
{
    argv[1] = NULL;

    // 修改进程名
    strncpy(argv[0], title, gtc_os_argv_last - argv[0]);

}

int main(int argc, char* argv[])
{
    const char* title = "Blue bird";
    // 初始化
    gtc_init_setproctitle(argv);

    // 等待输入
    printf("Please enter a character to change the process name.\n");
    getchar();

    // 修改进程名
    gtc_setproctitle(title, argv);

    printf("The process name has changed, please observe.\n");
    getchar();

    return 0;
}

 

标签:gtc,last,argv,char,修改,environ,Linux,进程,os
From: https://www.cnblogs.com/zhanggaofeng/p/17131466.html

相关文章

  • Linux 日志查找常用命令
    1.1cat、zcatcat-napp.log|grep"error":查询日志中含有某个关键字error的信息,显示行号。cat-napp.log|grep"error"--color:查询日志中含有某个关键字error......
  • 嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板
    本篇测评由电子发烧友的优秀测评者“ALSET”提供。米尔MYD-Y6ULX-V2开发板,基于NXPi.MX6UL/i.MX6ULL处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发......
  • Linux系列教程(十一)——Linux软件包管理之RPM命令
    前面我们介绍了Linux系统的常用命令介绍和文本编辑器vim命令的介绍。那么从这篇博客开始,我们会正式的讲解Linux的系统管理,首先要讲的是Linux的软件包管理。1、Linux软件......
  • DHCP源码分析_dhcpd后台进程子模块
    dhcpd是dhcp服务器端后台进程文件,dhcpd后台程序总是读取配置文件/etc/dhcpd.conf。一,守护进程的基本流程    dhcpd基本流程为: main(){/*设置isc和d......
  • Linux C 操作MySQL
    概述MySQL安装时,请确保安装了MySQL-server、MySQL-client、MySQL-devel。安装过程请参考:​​https://blog.51cto.com/weiyuqingcheng/5753459​​整理MySQLinclude目录#创......
  • Linux 进程符号的含义
    Linux进程符号的含义Linux查看进程,常使用ps那么进程符号你了解多少呢?如下图所示:   常见的进程间符号如下   Linux进程间的含义符号含义D(TASK_UN......
  • linux基本功系列之grep命令实战
    前言大家好,又见面了,我是沐风晓月,本文是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴......
  • gitlab修改分支名称
    第一步:先修改本地分支重命名  第二步:删除远程分支 第三步:将本地分支推送到远程分支上,如果远程分支不存在,则创建此远程分支  原文章地址:https://blog.csdn.......
  • 实战:第三章:更新数据只能是下月修改,当月不能修改
    第一种:可以利用缓存,commissionMerchantsBean是传入的参数对象//将合作对象更改后,应该在下个月份才生效//根据merchants_id查询tst_commission_merchant......
  • linux 挂载U盘
    查看磁盘,找到自己的U盘[root@localhost~]#fdisk-l磁盘/dev/sdb:31.0GB,31037849600字节,60620800个扇区Units=扇区of1*512=512bytes扇区大小(逻辑/物......