[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 ,...

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

Linux修改进程名称简介c语言程序运行时,进程的名称通常就是argv[0],修改进程名称就是修改内存中argv[0]存储的内容。下面介绍nginx修改进程名称的方法。...

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

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

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

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

nginx 改变标题 ngx_setproctitle

原理参见:http://blog.csdn.net/hengshan/article/details/7835981主要两个函数:ngx_int_t ngx_init_setproctitle(ng...

redis源码分析(1)——初始化

redis源码分析,介绍redis的初始化及启动过程

Linux进程-命令行参数和环境列表

命令行参数在C中,main函数有很多的变种,比如main(), int main(), int main(int argc, char *argv[]), int main(int argc, cha...

Shell脚本语法---在Makefile等文件…

1. Shell脚本语法 1.1. 条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exi...

第 34 章 终端、作业控制与守护进程

http://learn.akae.cn/media/ch34s01.html 1. 终端 请点评 1.1. 终端的基本概念 请点评 在UNIX系统中,用户通过终端登录系...

[C/C++]_[初级]_[通过映像名称判断进程是否存在]

场景1.有时候通过查询进程映像名称来判断某个程序是否在执行, 比如判断 adb.exe 是否正在运行, 从而不需要再次开启 adb进程; 或者某个服务是否开启, 比如AppleMobileDevice...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[redis] setproctitle.c实现 修改进程名称
举报原因:
原因补充:

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