一:守護進程功能的實現
//(1)攔截掉SIGHUP,那麼終端窗口關閉,進程就不會跟着關閉
//(2)守護進程,三章七節,一運行就在後臺,不會佔着終端。
//創建守護進程ngx_daemon();
//調用ngx_daemon()的時機: worker()子進程創建之前;
//ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E 'bash|PID|nginx'
//(1)一個master,4個worker進程,狀態S,表示休眠狀態,但沒有+,+號表示位於前臺進程組,沒有+說明我們這幾個進程不在前臺進程組;
//(2)master進程的ppid是1【老祖宗進程init】,其他幾個worker進程的父進程都是master;
//(3)tt這列都爲?,表示他們都脫離了終端,不與具體的終端掛鉤了
//(4)他們的進程組PGRP都相同;
//結論:
//1)守護進程如果通過鍵盤執行可執行文件來啓動,那雖然守護進程與具體終端是脫鉤的,但是依舊可以往標準錯誤上輸出內容,這個終端對應的屏幕上可以看到輸入的內容;
//2)但是如果這個nginx守護進程你不是通過終端啓動,你可能開機就啓動,那麼這個nginx守護進程就完全無法往任何屏幕上顯示信息了,這個時候,要排錯就要靠日誌文件了;
二:信號處理函數的進一步完善
//(2.1)避免子進程被殺掉時變成殭屍進程
//父進程要處理SIGCHILD信號並在信號處理函數中調用waitpid()來解決殭屍進程的問題;
//信號處理函數中的代碼,要堅持一些書寫原則:
//a)代碼儘可能簡單,儘可能快速的執行完畢返回;
//b)用一些全局量做一些標記;儘可能不調用函數;
//c)不要在信號處理函數中執行太複雜的代碼以免阻塞其他信號的到來,甚至阻塞整個程序執行流程;