[redis] setproctitle.c实现 修改进程名称

原创 2014年02月27日 16:36:17

这个文件接口实现没什么好说的,作用是实现修改进程名称,目的是显示argv[0]和地址,端口号。

代码路径: https://github.com/antirez/redis/blob/2.8/src/setproctitle.c


细节点:

1. environ和argv的内存布局:

基本所有的修改进程名称的处理,目标都是修改这两个指针指向的内存内容,先看这两块内存的布局图,了解了这两个指针指向的内容,基本对修改进程名称的原理也就行处了。参考[1][2]:

[1]:

the stack of a C program on an i386 machine looks like the following (going up from low addresses):

...
local variables of main
saved registers of main
return address of main
argc
argv
envp
stack from startup code
argc
argv pointers
NULL that ends argv[]
environment pointers
NULL that ends envp[]
ELF Auxiliary Table
argv strings
environment strings
program name
NULL

[2]


2. clearenv()的使用:

这个函数简单的描述就是 [3]上写的:

The clearenv() function clears the environment of all name-value pairs and sets the value of the external variable environ to NULL.

redis的实现上,先使用oldenv保存environ指向的地址,然后调用clearenv后,environ为NULL,但oldenv指向的内容依然有效(这个很重要,environ原来指向的内容并没有清空),这时再把oldenv解析,调用setenv函数。


疑问:

1. spt_copyenv和set_copyargs具体起什么作用?我感觉只是简单的复制。
2. 程序中复制一份新的program_invocation_name的内容,是避免原地址的数据被修改和跨平台使用吗?

这两个问题已得到解答,应该是重新分配空间,把原指针指向新的地址,这样当对argv[0]执行了snprintf后,即使新的内容长度超过了原有argv[0]的长度,原有的指针指向的内容也是有效的。



参考链接:
[1]: http://www.win.tue.nl/~aeb/linux/hh/stack-layout.html
[2]: http://blog.csdn.net/angelina525/article/details/10949943
[3]: http://man7.org/linux/man-pages/man3/clearenv.3.html


版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux修改进程名称(setproctitle())

[cpp] view plain copy 1.1    介绍   每一个c程序都有个main函数,作为程序启动入口函数。main函数的原型是int main(int argc ,...
  • fivedoumi
  • fivedoumi
  • 2016年04月13日 15:49
  • 943

Linux C 修改进程名称(setproctitle())

Linux修改进程名称简介c语言程序运行时,进程的名称通常就是argv[0],修改进程名称就是修改内存中argv[0]存储的内容。下面介绍nginx修改进程名称的方法。...
  • u012573259
  • u012573259
  • 2017年02月15日 20:17
  • 829

Linux修改进程名称(setproctitle())

1.1    介绍 每一个c程序都有个main函数,作为程序启动入口函数。main函数的原型是int main(int argc , char *argv[]);其中argc表示命令行参数的个数;a...
  • hengshan
  • hengshan
  • 2012年08月06日 16:38
  • 15571

Nginx学习笔记(十五):ngx_setproctitle()

前言 这是一个小插曲。。在ngx_worker_process_cycle()函数里面有个ngx_setproctitle()用来修改worker进程名字。然后,发现里面的东西很有趣。。关键是里面内容...
  • fzy0201
  • fzy0201
  • 2014年03月13日 09:37
  • 1597

nginx 改变标题 ngx_setproctitle

原理参见:http://blog.csdn.net/hengshan/article/details/7835981主要两个函数:ngx_int_t ngx_init_setproctitle(ng...
  • jiaoyongqing134
  • jiaoyongqing134
  • 2016年07月27日 16:22
  • 402

[redis] setproctitle.c实现 修改进程名称

这个文件接口实现没什么好说的,作用是实现修改进程名称,目的是显示argv[0]和地址,端口号。 细节点: 1. environ和argv的内存布局: 基本所有的修改进程名称的处理,目标都是修改这两个指...
  • ronan_ka
  • ronan_ka
  • 2014年02月27日 16:36
  • 1888

Worker::setProcessTitle()解析

Worker::setProcessTitle()解析
  • u011356348
  • u011356348
  • 2017年10月17日 16:57
  • 147

修改进程名字

每一个c程序都有个main函数,作为程序启动入口函数。main函数的原型是int main(int argc , char *argv[]);其中argc表示命令行参数的个数;argv是一个指针数组,...
  • MAOTIANWANG
  • MAOTIANWANG
  • 2015年12月22日 09:20
  • 1380

java修改tomcat进程名字

1、修改tomcat进程名字:  当同一个服务器上启动多个tomcat后,我们会在任务管理器中看见多个java.exe,当我们需要对某个tomcat进行监控时,却无法区分出该tomcat的进程,那么...
  • ikaituozhe
  • ikaituozhe
  • 2013年10月21日 15:47
  • 1598

Nginx学习(15)—ngx_setproctitle()

进程名称在哪儿 简单来说,该函数就是用来修改进程名字的。这里参考博文《Linux修改进程名称》,在此感谢博主。 Linux下用ps命令可以看到显示的进程名字。这个进程的名字会体现在它的ma...
  • abv123456789
  • abv123456789
  • 2014年04月28日 12:03
  • 1331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[redis] setproctitle.c实现 修改进程名称
举报原因:
原因补充:

(最多只允许输入30个字)