仿照redis写的nginx开机画面
生活随笔
收集整理的這篇文章主要介紹了
仿照redis写的nginx开机画面
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
redis有一個開機畫面:
下面是我寫的的nginx開機畫面:
新建一個文件 asciilogo.h
//仿照redis風格打印一個logo,這樣啟動的時候就不會不注意
char *ascii_logo =
" \n"
"%s Port: %d PID: %ld http://nginx.org/ \n"
" \n"
".121 .22, ,22222222222, ,22, 121. 121 .22, ,22, \n"
"366641 4666, 156666666666662 .5665. 16663 156662 46664, ,36665. \n"
"36656641 4666, 15664222222236662 .5665. 16663 .25666562 .2566641 ,366663, \n"
"3656566641 4666, 15563 25561 .5555. 16663 .256665HM62 .25666411466653. \n"
"366621466652. 4666, 16653 .......,,,,.. ,,,, 16663 .256664,36662 .2466666652. \n"
"36661 1466652. 4666, .4665, 3666666555555, .5555. 16563 .356664, 26662 26566563 \n"
"36661 14666535666, .4665, 254444456665, .5665. 16664356664, 26562 146665466652. \n"
"36561 ,46665566, .4665, ,4665, .5665. 166566653, 26662 1566652 1466652. \n"
"46661 ,366666, .466544444445665, .5665. 1656653, 26663 2566641 1466653. \n"
"2565, ,3564. .4566666666664, 4664. ,5653. 15651 36641 ,4564. \n";
修改nginx.c
#include "asciilogo.h" //printf("%s\n",ascii_logo);char *buf = malloc(1024*16);//int port=ntohs(((struct sockaddr_in *)((ngx_listening_t *)cycle->listening.elts)[0].sockaddr)->sin_port);ngx_listening_t *ls=(ngx_listening_t *)cycle->listening.elts;int port=ntohs(((struct sockaddr_in *)(ls[0].sockaddr))->sin_port);snprintf(buf,1024*16,ascii_logo,NGINX_VER,port,(long) getpid());printf("%s\n", buf);if (ngx_process == NGX_PROCESS_SINGLE) {ngx_single_process_cycle(cycle);} else {ngx_master_process_cycle(cycle);}return 0;
獲取nginx端口:
ntohs(((struct?sockaddr_in?*)((ngx_listening_t?*)cycle->listening.elts)[0].sockaddr)->sin_port);
注意:最好不要用一句長句,不然報錯了都不容易發現。
之前在gdb下可以打印出數據:
然后我就直接將這局拷貝到nginx.c中,因為語法上多了個*,所以怎么也編譯不過去。所以我就非常不解。
然后,只好把長句分開一句句從最里面開始試,后來成功了,其實已經去掉了*,只是自己沒注意到。
但是我還是想知道長句為什么不行,后來QQ群里有人告訴我:
所以這個事兒得出一些結論:
第一:避免使用長句;
第二:不要太相信gdb的表達式,因為他可能做了所謂的小動作;
第三:自己使用gdb的時候盡量用正確的語法,不要亂加*
總結
以上是生活随笔為你收集整理的仿照redis写的nginx开机画面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux守护进程实现
- 下一篇: Linux socket 网络编程 常用