設置進程的名稱

設置進程的名稱

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. 咱們只須要從新分配空間(不必定是連續的)來存儲這些內容,將地址分別複製給argvenviron數組,這樣原來程序的流程不受影響。2. 咱們能夠在原agv最開始的地方和environ最結尾的地方,隨便設置你顯示的內容便可,也就是圖中./exe開始的地方和Env5=val5最後一個0結尾復的地方。只須要注意到,設置的內容必須與0結尾,並且不能超過該內存空間。redis

redis如何實現

  redis的實如今setproctitle裏面。只是實現有點疑惑:數組

  1. 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

  2. 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的代碼貌似不是很規範……或者是咱們一直接觸的就不規範,哈……內存

相關文章
相關標籤/搜索