首 页 行业资讯 新车 试驾评测 养车用车 车型库

linux修改一下进程

发布网友 发布时间:2022-04-22 01:08

我来回答

1个回答

热心网友 时间:2024-04-20 01:01

在linux中prctl可以满足这个要求,下满是man手册:
PR_SET_NAME (since Linux 2.6.9)
Set the process name for the calling process, using the value in
the location pointed to by (char *) arg2. The name can be up to
16 bytes long, and should be null terminated if it contains
fewer bytes.

但是prctl修改的进程名,只能是16个字节(包括'\0')。下面是修改的代码(changetitle.c):

#include <stdio.h>

#include <sys/prctl.h>

int main(int argc, char *argv[], char *envp[])

{

char *new_name = "abcdefghijklmnopqrstuvwxyz";

getchar();

prctl(PR_SET_NAME, new_name);

getchar();

return 0;

}
当新名称长度大于16时就会截断,上面的新名字截断后是abcdefghijklmno。这对于我们来说是有缺陷的。而且通过ps -aux 查看,进程名称并没有改变,改变的只是/prco/$(PID)/stat和
/prco/$(PID)/status的值,而/prco/$(PID)/cmdline并没有改变。这种方式使用起来也是不方便的。
下面介绍另一种方式,可以与上面的方式互补。
首先看一下main函数的原型:int main(int argc, char *argv[]);
argv[0]存放的是终端执行的程序名称也就是进程名。argv[1...argc-1]存放的是命令行参数。
linux中main()还有一个隐藏参数就是环境变量信息,存放了运行时所需要的环境变量。
我们可以通过以下来访问这个变量

extern char **environ;

argv与environ是连续存放在栈区的。下面代码可以查看参数信息:

#include <stdio.h>

#include <string.h>

extern char **environ;

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

{

int i;

printf("argc:%d\n" , argc);

for (i = 0; i < argc; ++i)

{

printf("argv[%d](0x%x):%s\n" , i , (unsigned int)argv[i], argv[i]);

}

printf("evriron=0x%x\n" , (unsigned int)environ[0]);

return 0;

}
通过上面可以看出,我们只需要修改argv[0]所指向的内存空间的内容,就可以修改进程名。但是如果新名称比argv[0]的长度小,我们可以直接修改,并把多余的部分请0,如果新名称
比argv[0]长我们需要两步:
1、申请新内存保存环境变量信息和argv[1...argc-1]参数信息
2、修改argv[0],将新名称往后到environ的最后一项清0
以下是参考代码:

#include <unistd.h>

#include <stdio.h>

#include <stdarg.h>

#include <string.h>

#include <stdlib.h>

#include <sys/prctl.h>

# define MAXLINE 2048

extern char **environ;

static char **g_main_Argv = NULL; /* pointer to argument vector */

static char *g_main_LastArgv = NULL; /* end of argv */

void setproctitle_init(int argc, char **argv, char **envp)

{

int i;

for (i = 0; envp[i] != NULL; i++) // calc envp num

continue;

environ = (char **) malloc(sizeof (char *) * (i + 1)); // malloc envp pointer

for (i = 0; envp[i] != NULL; i++)

{

environ[i] = malloc(sizeof(char) * strlen(envp[i]));

strcpy(environ[i], envp[i]);

}

environ[i] = NULL;

g_main_Argv = argv;

if (i > 0)

g_main_LastArgv = envp[i - 1] + strlen(envp[i - 1]);

else

g_main_LastArgv = argv[argc - 1] + strlen(argv[argc - 1]);

}

void setproctitle(const char *fmt, ...)

{

char *p;

int i;

char buf[MAXLINE];

extern char **g_main_Argv;

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com