Daemon程序是一直運行的服務端程序,又稱爲守護進程。一般在系統後臺運行,沒有控制終端不與前臺交互,Daemon程序通常做爲系統服務使用。Daemon是長時間運行的進程,一般在系統啓動後就運行,在系統關閉時才結束。通常說Daemon程序在後臺運行,是由於它沒有控制終端,沒法和前臺的用戶交互。Daemon程序通常都做爲服務程序使用,等待客戶端程序與它通訊。咱們也把運行的Daemon程序稱做守護進程
int daemon (int __nochdir, int __noclose);
若是__nochdir的值爲0,則將切換工做目錄爲根目錄; linux
若是__noclose爲0,則將標準輸入,輸出和標準錯誤都重定向到/dev /null。 shell
通過這個函數調用後的程序將運行在後臺,成爲一個daemon程序,而linux下大多的服務都是以此方式運行的 服務器
最後生成的路徑:/home/pc/workspace/daemon/test 函數
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc, char *argv[]) { FILE* pidfp = fopen( "kmc_sa.pid", "w" ); if ( pidfp == NULL ) { perror("error daemon...\n"); exit( 1 ); } printf("path max %d\n", PATH_MAX); if(daemon(1, 1) < 0) // 若成功,則後面的代碼就是後臺服務代碼 { perror("error daemon...\n"); exit(1); } printf("pid:%d\n", getpid()); // get process id printf("uuid:%d\n", getuid()); // get user id fprintf( pidfp, "%d\n", (int) getpid() ); // 將id保存到文件中,方便後續的關閉進程 fclose( pidfp ); // sleep(10); while(1) { ...具體的後臺運行代碼 } return 0; }腳本:test.sh
#!/bin/sh echo "hello world", $1 #表示輸出第一個參數 case "$1" in start) if [ -x /home/pc/workspace/daemon/test ] ; then #首先判斷改程序是否爲可執行的,是則開始執行 echo "start..." /home/pc/workspace/daemon/test & fi ;; stop) kill -9 `cat kmc_sa.pid` # 經過以前保存的進程號文件來關閉進程,cat前面的符號不是單引號,而是數字1表明的符號 ;; restart) # 就是講以前的兩步再執行一遍 echo "kill" echo "restart" ;; *) echo "usage: $0 { start | stop | restart}" >&2 exit 1 ;; esac
在上例test.c中,首先是利用daemon建立一個後臺進程,在daemon後面的函數將是在後臺執行的代碼,特別是對於服務器代碼而言,是一個while(1)老是監聽端口的死循環,所以在關閉後臺進程的時候,須要知道後臺進程的pid,因此程序中在daemon執行後,利用getpid()函數得到子進程的pid,並將pid保存在一個文件中。 ui
對於腳本程序,因爲我並不懂,直接從一個開源的服務器啓動腳本copy出來的,其是利用case來判斷是執行哪一個命令,須要注意的是在執行以前,首先對文件的屬性進行判斷,如果可執行文件方纔繼續執行;關閉進程則利用kill命令和以前保存的進程號來實現 spa