摘要:守護進程為什么需要守護進程呢普通進程在運行時可以被控制終端發出的信號打斷而守護進程由于脫離了控制終端所以不會被其打斷守護進程創建的標準流程調用設置文件創建的掩碼子進程并關閉父進程調用創建新會話把當前工作目錄切換為根目錄不需要的文件描述符全部
守護進程
為什么需要守護進程呢? 普通進程在運行時可以被控制終端發出的信號打斷, 而守護進程由于脫離了控制終端, 所以不會被其打斷.
守護進程創建的標準流程調用umask設置文件創建的掩碼
fork子進程并關閉父進程
調用posix_setsid創建新會話
把當前工作目錄切換為根目錄
不需要的文件描述符全部關閉
標準輸入輸出錯誤重定向
除了第2步和第3步,其它的其實都是可選的.
守護進程PHP代碼function daemon() { umask(0); $pid = pcntl_fork(); if ($pid > 0) { exit(0); } elseif ($pid < 0) { printf("fork failed"); } posix_setsid(); $pid = pcntl_fork(); if ($pid > 0) { exit(0); } elseif ($pid < 0) { printf("fork failed"); } }
把一個進程變成守護進程, 首先要讓該進程脫離當前的控制終端, 要達到這個目的需要調用posix_setsid.
但我們的代碼為什么在調用posix_setsid之前要fork一次呢? 這是因為調用posix_setsid的進程必須不能是session leader, 為了確保萬無一失, 會先fork一個子進程, fork出來的子進程就必然不是session leader了.
那在調用posix_setsid之后為什么還要再fork一次呢? 其實這必不是必須的, nginx在實現daemon時就沒有fork兩次.
很多daemon的實現都沒有fork兩次. 只是有人推薦在sysv system上, 再fork一次, 可以避免守護進程打開控制終端, 因為再fork一次之后, 子進程就不是session leader了.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22557.html
摘要:命令行是與守護進程進行交互的主要工具。感興趣的話,你也可以開發一個,使用與守護進程進行交互就好了。命令行與守護進程如何交互從左至右理解上圖最左側是客戶端,即命令行。而在與上運行時,守護進程事實上運行在虛擬機中。 譯者按: Docker是典型的C/S架構,其守護進程(daemon)與命令行(CLI)是通過REST API進行交互的。 原文: Understanding how the D...
摘要:的作用是為其他線程的運行提供服務,比如說線程。在某些平臺上,指定一個較高的參數值可能使線程在拋出之前達到較大的遞歸深度。參數的值與最大遞歸深度和并發程度之間的關系細節與平臺有關。 今天研究了下Java線程基礎知識,發現以前太多知識知識略略帶過了,比較說Java的線程機制,在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程),以及構造器中的s...
閱讀 2804·2021-11-24 09:39
閱讀 2777·2021-09-23 11:45
閱讀 3404·2019-08-30 12:49
閱讀 3352·2019-08-30 11:18
閱讀 1908·2019-08-29 16:42
閱讀 3344·2019-08-29 16:35
閱讀 1321·2019-08-29 11:21
閱讀 1912·2019-08-26 13:49