歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下Daemon的實現

Linux下Daemon的實現

日期:2017/2/28 16:01:28   编辑:Linux教程

注:Linux下可以直接調用damon函數來實現daemon進程,沒必要重新實現,理解其原理即可。

在Linux中專門提供了一個函數來完成這個daemon化的過程,這個函數的原型如下

int daemon (int __nochdir, int __noclose);

如果__nochdir的值為0,則將切換工作目錄為根目錄;如果__noclose為0,則將標准輸入,輸出和標准錯誤都重定向到/dev/null。

經過這個函數調用後的程序將運行在後台,成為一個daemon程序,而linux下大多的服務都是以此方式運行的。

我們來看一個簡單的例子。例如編寫例子程序test.c

#include <unistd.h> #include <stdio.h>   int do_sth() {  //Add what u want return 0;  } int main() {  daemon(0,0); //or Daemon(1,1);  while ( 1 ) {  do_sth();  sleep(1);  }  }

編譯並運行

[leconte@localhost daemon]$ gcc -o test test.c [leconte@localhost daemon]$ ./test

程序進入了後台,通過ps查看進程情況,可以看到進程的父進程id為1,即init進程

用lsof查看test進程所打開的文件,可以看到文件描述符0,1,2都被重定向到/dev/null

並且能夠看到,進程的當前工作目錄(cwd)為根目錄/,daemon函數已經幫我們完成了daemon化的過程,接下來我們只需要關注於程序功能的實現了。

Linux 守護進程

Linux 守護進程概述

Linux Daemon(守護進程)是運行在後台的一種特殊進程。它獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。它不需要用戶輸入就能運行而且提供某種服務,不是對整個系統就是對某個用戶程序提供服務。Linux系統的大多數服務器就是通過守護進程實現的。常見的守護進程包括系統日志進程syslogd、 web服務器httpd、郵件服務器sendmail和數據庫服務器mysqld等。 守護進程一般在系統啟動時開始運行,除非強行終止,否則直到系統關機都保持運行。守護進程經常以超級用戶(root)權限運行,因為它們要使用特殊的端口(1-1024)或訪問某些特殊的資源。 一個守護進程的父進程是init進程,因為它真正的父進程在fork出子進程後就先於子進程exit退出了,所以它是一個由init繼承的孤兒進程。守護進程是非交互式程序,沒有控制終端,所以任何輸出,無論是向標准輸出設備stdout還是標准出錯設備stderr的輸出都需要特殊處理。 工作原理 Linux 守護進程的工作模式是服務器/客戶機(Server/Client),服務器在一個特定的端口上監聽(Listen)等待客戶連接,連接成功後服務器和客戶端通過端口進行數據通信。守護進程的工作就是打開一個端口,並且監聽(Listen)等待客戶連接。如果客戶端產生一個連接請求,守護進程就創建(Fork)一個子服務器響應這個連接,而主服務器繼續監聽其他的服務請求。 工作模式 Linux 守護進程有兩種工作模式:stand-alone模式和xinetd模式。 (1)stand-alone模式 獨立運行的守護進程由init負責管理,所有獨立運行守護進程的腳本在/etc/rc.d/init.d/目錄下。獨立運行的守護進程工作方式稱作stand-alone,是Unix傳統的C/S模式的訪問模式。服務器監聽(Listen)在一個特點的端口上等待客戶端的聯機。如果客戶端產生一個連接請求,守護進程就創建(Fork)一個子服務器響應這個連接,而主服務器繼續監聽。工作在stand-alone模式下的網絡服務有route、gated、web服務器等。在Linux系統中通過stand-alone工作模式啟動的服務由/etc/rc.d/下面對應的運行級別當中的符號鏈接啟動。 (2)xinetd模式 從守護進程的概念可以看出,對於系統所要求的每一種服務,都必須運行一個監聽某個端口連接所發生的守護進程,這意味著資源浪費。為了解決這個問題,Linux引進了"網絡守護進程服務程序"的概念。RedHat Linux使用的網絡守護進程是xinted(eXtended InterNET Daemon)。和stand-alone模式相比xinetd模式也稱 InternetSuper-Server(超級服務器)。xinetd能夠同時監聽多個指定的端口,在接受用戶請求時,他能夠根據用戶請求的端口不同,啟動不同的網絡服務進程來處理這些用戶請求。可以把xinetd看做一個管理啟動服務的管理服務器,它決定把一個客戶請求交給那個程序處理,然後啟動相應的守護進程。 和stand-alone工作模式相比,系統不必為每一個網絡服務進程監聽其服務端口,運行xinetd守護進程就可以同時監聽所有服務端口,這樣就降低了系統開銷,保護系統資源。但是對於訪問量大、經常出現並發訪問時,xinetd想要頻繁啟動對應的網絡服務進程,反而會導致系統性能下降。一般來說系統一些負載高的服務,比如Apache、sendmail等服務是單獨啟動的。而其他服務類型都可以使用xinetd超級服務器管理。 查看系統為Linux服務提供那種模式方法在Linux命令行可以使用pstree命令可以看到兩種不同方式啟動的網絡服務。
Copyright © Linux教程網 All Rights Reserved