国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

Hi,歡迎來到嵌入式培訓(xùn)高端品牌 - 華清遠(yuǎn)見教育科技集團(tuán)<北京總部官網(wǎng)>,專注嵌入式工程師培養(yǎng)15年!
當(dāng)前位置: > 華清遠(yuǎn)見教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > 說說守護(hù)進(jìn)程
說說守護(hù)進(jìn)程
時間:2016-12-30作者:華清遠(yuǎn)見

守護(hù)進(jìn)程又稱精靈進(jìn)程(daemon),一般在系統(tǒng)啟動時開始,而在系統(tǒng)關(guān)閉時終止。沒有控制終端,運(yùn)行在后臺。在linux系統(tǒng)中有很多這類進(jìn)程。

下面說一下如何創(chuàng)建一個守護(hù)進(jìn)程。

(1) 使用umask修改文件的屏蔽字,為文件賦予跟多的權(quán)限,因?yàn)槔^承來的文件可能某些權(quán)限被屏蔽,從而失去某些功能,如讀寫。
        (2) 調(diào)用fork函數(shù)創(chuàng)建一個子進(jìn)程,而父進(jìn)程退出。
        (3) 調(diào)用settid創(chuàng)建一個新會話,當(dāng)前進(jìn)程為會話組長,并且關(guān)閉控制終端。
        (4) 修改進(jìn)程工作目錄為根目錄,chdir(“/”).
        (5) 關(guān)閉不需要的從父進(jìn)程繼承過來的文件描述符。
        (6) 打開/dev/null,null也稱黑洞設(shè)備,就是寫入或讀出什么都沒有效果。代開這個設(shè)備是文件具有0,1,2三個文件描述符,但是對標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)出錯的操作都沒有效果。這部分內(nèi)容不是必須的。

下面使用一個例程說一下這個過程。

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

int main()
        {

        pid_t pid;
                struct rlimit r;
                int i;

//XXX step 1:set umask
                umask(0);

//XXX setp 2:fork
                if((pid = fork()) < 0)
                {
                        perror("fork");
                        exit(0);
                }
                else if(pid != 0)
                {
                        exit(0);
                }

//XXX step 3:setsid
                setsid();

//XXX step 4:chdir
                chdir("/");

//XXX step 5:close all open file descriptors
                if(r.rlim_max == RLIM_INFINITY)
                {
                        r.rlim_max = 1024;
                } 
                for(i = 0; i < r.rlim_max; i++)
                {
                        close(i);
                }

                while(1)
                {

        }
                return 0;
        }

上面便是一個守護(hù)進(jìn)程的創(chuàng)建過程,可是一些書或網(wǎng)絡(luò)上寫守護(hù)進(jìn)程,會在第三步和第四步之間添加這樣一點(diǎn)代碼。

        if((pid = fork()) < 0)
                {
                        perror("fork");
                        exit(0);
                }
                else if(pid != 0)
                {
                        exit(0);
                }

很多學(xué)生就會問,為什么要創(chuàng)建兩次進(jìn)程呢,這是因?yàn)榈谌浇Y(jié)束后,進(jìn)程創(chuàng)建了一個新的會話組,并成為會話組長,而會話組長可能獲得控制終端,如果獲得了控制終端那么或這個進(jìn)程就不是守護(hù)進(jìn)程了。所以添加了這幾句代碼,讓進(jìn)程失去會話組長的身份,從而沒有獲得控制終端的權(quán)限。

發(fā)表評論
評論列表(網(wǎng)友評論僅供網(wǎng)友表達(dá)個人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)