nginx更改进程名称 学习笔记

如何更改进程名称

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

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,也就是说,若修改的名称再长,甚至会覆盖住环境变量值。
在这里插入图片描述
于是我们想到可以在内存空间中再开辟一个与存放所有环境变量值相同大小的空间,将所有环境变量值搬过去后,就又留出了更大的空间来修改进程名。 这样就不会担心进程名覆盖住环境变量了。当然,这样处理的结果是,你未来永远也用不上argv[1]以后的指令了。
还有一点需要注意的argv[]和环境变量的数组environ[]最后一个再后一个的空间内存为NULL。
即environ[strlen(environ)] = NULL;
所以遍历以上两个数组的语句可以写成:

for(int i=0;environ[i];i++){}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值