(3.5)守護進程及信號處理實戰

一:守護進程功能的實現

//(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)不要在信號處理函數中執行太複雜的代碼以免阻塞其他信號的到來,甚至阻塞整個程序執行流程;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章