http://luoguochun.cn/2014/07/04/set-proccess-title/nginx
咱们平时ps进程时,显示的进程标题是咱们输入的程序名以及一些参数。这种显示方式并不是很是直观,咱们须要一种方式能够设置程序的标题,一眼就知道该进程时什么鸟。如redis或nginx:git
root 8527 1 0 10:30 ? 00:00:00 nginx: master process nginx nginx 8528 8527 0 10:30 ? 00:00:00 nginx: worker process
实现的原理很是简单,咱们只须要修改argv[0],说指向的那段内存空间的内容便可。可是为了使程序的正常逻辑不受影响,事先要把原理的内容保存起来,并经过原来的方式能够访问。
argv[0]所指向的的空间是和·enviorn·所指向的内存空间是连续的,在程序启动的时候,系统已经设置好这些空间了。如图所示:github
那么,1. 咱们只须要从新分配空间(不必定是连续的)来存储这些内容,将地址分别复制给argv
或environ
数组,这样原来程序的流程不受影响。2. 咱们能够在原agv
最开始的地方和environ
最结尾的地方,随便设置你显示的内容便可,也就是图中./exe
开始的地方和Env5=val5
最后一个0结尾复的地方。只须要注意到,设置的内容必须与0结尾,并且不能超过该内存空间。redis
redis的实如今setproctitle里面。只是实现有点疑惑:数组
argc个数少于argv数组数?ui
for (i = 0; i < argc || (i >= argc && argv[i]); i++) { if (!argv[i] || argv[i] < end) continue; end = argv[i] + strlen(argv[i]) + 1; }
按照咱们一直以来的常识,是经过argc从argv里面取出数据来的,而他这里i < argc || (i >= argc && argv[i])
这个条件明显就是argc可能会少于argv个数。什么状况下会出现这种状况呢?spa
SPT.nul貌似没有用code
if (nul < SPT.nul) { *SPT.nul = '.'; } else if (nul == SPT.nul && &nul[1] < SPT.end) { *SPT.nul = ' '; *++nul = '\0'; }
这是setproctitle
里面的一个奇怪的逻辑,更本没想到他是干吗用的。并且貌似SPT.nul在set proc title里面没有什么做用。进程
虽然redis很是出名,可是redis的代码貌似不是很规范……或者是咱们一直接触的就不规范,哈……内存