注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

偶有所得,记录在此

有分享交流才有进步,永远不要固步自封

 
 
 

日志

 
 

[Nginx] setproctitle 实现原理  

2010-07-12 17:37:07|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Linux 进程的命令行参数以及 Environ 环境变量是在一块连续的内存上存储的;顺序是先命令行参数,后环境变量。

修改 argv[0] 指针指向的字符串,就能达到 setproctitle 的目的。

但问题是,得给 argv[0] 扩展空间以存储新的 proc title。

Nginx 实现的方法是:

1) 分配新的内存,将命令行参数和 Environ 复制出去。

2) 将原来用于存储命令行参数和 Environ 的空间用来设置新的 proc title,长度足够了。

FreeBSD, NetBSD, OpenBSD 直接调用 setproctitle 来修改 proc title。

备注:
Python 下面,无法直接修改 argv,必须通过写扩展才能实现。

附 Nginx 相关注释
-------------------------
/*
 * To change the process title in Linux and Solaris we have to set argv[1]
 * to NULL and to copy the title to the same place where the argv[0] points to.
 * However, argv[0] may be too small to hold a new title.  Fortunately, Linux
 * and Solaris store argv[] and environ[] one after another.  So we should
 * ensure that is the continuous memory and then we allocate the new memory
 * for environ[] and copy it.  After this we could use the memory starting
 * from argv[0] for our process title.
 *
 * The Solaris's standard /bin/ps does not show the changed process title.
 * You have to use "/usr/ucb/ps -w" instead.  Besides, the UCB ps dos not
 * show a new title if its length less than the origin command line length.
 * To avoid it we append to a new title the origin command line in the
 * parenthesis.
 */

参考文章:setproctitle
  评论这张
 
阅读(1323)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017