daemon函數結合腳本實現start, stop, restart

1. daemon函數

Daemon程序是一直運行的服務端程序,又稱爲守護進程。一般在系統後臺運行,沒有控制終端不與前臺交互,Daemon程序通常做爲系統服務使用。Daemon是長時間運行的進程,一般在系統啓動後就運行,在系統關閉時才結束。通常說Daemon程序在後臺運行,是由於它沒有控制終端,沒法和前臺的用戶交互。Daemon程序通常都做爲服務程序使用,等待客戶端程序與它通訊。咱們也把運行的Daemon程序稱做守護進程
int daemon (int __nochdir, int __noclose);

若是__nochdir的值爲0,則將切換工做目錄爲根目錄; linux

若是__noclose爲0,則將標準輸入,輸出和標準錯誤都重定向到/dev /null。 shell

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

2. daemon實例

最後生成的路徑:/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

3. 說明:

    在上例test.c中,首先是利用daemon建立一個後臺進程,在daemon後面的函數將是在後臺執行的代碼,特別是對於服務器代碼而言,是一個while(1)老是監聽端口的死循環,所以在關閉後臺進程的時候,須要知道後臺進程的pid,因此程序中在daemon執行後,利用getpid()函數得到子進程的pid,並將pid保存在一個文件中 ui

    對於腳本程序,因爲我並不懂,直接從一個開源的服務器啓動腳本copy出來的,其是利用case來判斷是執行哪一個命令,須要注意的是在執行以前,首先對文件的屬性進行判斷,如果可執行文件方纔繼續執行;關閉進程則利用kill命令和以前保存的進程號來實現 spa

相關文章
相關標籤/搜索