寫一個簡單的守護進程

1、進程查看命令ps

(1)ps -aux偏向於進程佔有各種資源(CPU、內存)

(2)ps -ajx偏向於顯示進程各種有關的ID號(父進程的ID  ppid,進程組ID pgid,進程會話ID SID)

2、守護進程

(1)deamon,表示守護進程,簡稱d(進程後面帶d的基本都是守護進程)

(2)長期運行(從開機到關機)

(3)與控制檯脫離(普通進程和控制檯綁定,控制檯關閉,進程結束)

(4)服務器,服務器的程序一般是守護進程

3、常見的守護進程

(1)syslogd系統日誌守護進程

(2)cron實現操作系統時間管理

4、編寫一個簡單的守護進程(creat_deamon()函數)

(1)子進程等待父進程退出

(2)子進程使用setsid創建新的會話器,脫離控制檯

(3)調用chdir將當前工作目錄設置爲根目錄“\”

(4)umask設置爲0以取消任何文件權限屏蔽

(5)關閉所有文件描述符

(6)將0、1、2定位到/dev/null

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

              

void creat_daemon(void)
{
    int i = 0;
    pid_t pid = -1;
    pid = fork();
    if(pid == -1)
    {
        printf("fork error\n");
    }
    else if(pid > 0)//父進程直接退出
    {
        exit(1);
    }

    //子進程運行下面的代碼

    setsid();//子進程創建新的會話期

    chdir("/");//將當前工作路經設置爲/

    umask(0);//取消任何文件的權限屏蔽(把權限調到最大)

    
    //關閉所有文件描述符
    //獲取當前系統中允許打開的最大文件描述符數目
    for(i=0;i<sysconf(_SC_ARG_MAX);i++)
    {
        close(i);
    }
    open("/dev/null",O_RDWR);
    open("/dev/null",O_RDWR);
    open("/dev/null",O_RDWR);
}

int main(int argc,char*argv[])
{
    
    creat_daemon();
    while(1)
    {
        printf("I am running\n");
        sleep(1);
    }
    return 0;
}


 

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