如何更改进程名称

在进入正题之前,我们需要了解一下以下参数的作用:

int main(int argc,char * const*argv)
{}

相信大家一定都见过以上的参数项,但是从来都没有使用过,但是通过对linux编程的学习,我们可以了解到,其中argc代表的是执行这个程序的命令行参数个数,argv实际上可以看成一个二维字符串数组,包含了argc个字符串,那么这些字符串都是些什么呢?
比如说:
当你在linux中包含有可执行文件的目录下想要运行一个名称为nginx的程序时

./nginx -v -s 5

可以看到指令可以分成4段,则argc=4,argv[0]="./nginx\0",argv[1]="-v\0",等等。。

好了,现在进入正题,由于很多程序会自己fork()出子进程,为了能分辨出父进程和子进程的区别,就需要更改进程名称,比方说,nginx的父进程名称为master process而子进程的名称为worker process。

而进程名称就存储在argv[0]中,但是由于argv的const属性使其无法另辟内存,就需要直接修改argv[0]的值,但是因为argv[]的所有内存空间是连续的,如果修改的名称过程则会覆盖住argv[1],argv[2]后面的所有字符串。

并且系统中的环境变量值存储的空间紧挨着argv,也就是说,若修改的名称再长,甚至会覆盖住环境变量值。

nginx 指定进程数_环境变量


于是我们想到可以在内存空间中再开辟一个与存放所有环境变量值相同大小的空间,将所有环境变量值搬过去后,就又留出了更大的空间来修改进程名。 这样就不会担心进程名覆盖住环境变量了。当然,这样处理的结果是,你未来永远也用不上argv[1]以后的指令了。

还有一点需要注意的argv[]和环境变量的数组environ[]最后一个再后一个的空间内存为NULL。

即environ[strlen(environ)] = NULL;

所以遍历以上两个数组的语句可以写成:

for(int i=0;environ[i];i++){}