新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 進(jìn)程控制開發(fā)之:實(shí)驗(yàn)內(nèi)容

        進(jìn)程控制開發(fā)之:實(shí)驗(yàn)內(nèi)容

        作者: 時(shí)間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/257129.htm

        7.4.2編寫守護(hù)進(jìn)程

        1.目的

        通過編寫一個(gè)完整的守護(hù)進(jìn)程,使讀者掌握守護(hù)進(jìn)程編寫和調(diào)試的方法,并且進(jìn)一步熟悉如何編寫多進(jìn)程程序。

        2.內(nèi)容

        在該中,讀者首先建立起一個(gè)守護(hù)進(jìn)程,然后在該守護(hù)進(jìn)程中新建一個(gè)子進(jìn)程,該子進(jìn)程暫停10s,然后自動(dòng)退出,并由守護(hù)進(jìn)程收集子進(jìn)程退出的消息。在這里,子進(jìn)程和守護(hù)進(jìn)程的退出消息都在系統(tǒng)日志文件(例如“/var/log/messages”,日志文件的全路徑名因版本的不同可能會(huì)有所不同)中輸出。子進(jìn)程退出后,守護(hù)進(jìn)程循環(huán)暫停,其間隔時(shí)間為10s。

        3.實(shí)驗(yàn)步驟

        (1)畫出該實(shí)驗(yàn)流程圖。

        該程序流程圖如圖7.9所示。

        圖7.9實(shí)驗(yàn)7.4.2流程圖

        (2)實(shí)驗(yàn)源代碼。

        具體代碼設(shè)置如下:

        /*daemon_proc.c*/

        #includestdio.h>

        #includestdlib.h>

        #includesys/types.h>

        #includeunistd.h>

        #includesys/wait.h>

        #includesyslog.h>

        intmain(void)

        {

        pid_tchild1,child2;

        inti;

        /*創(chuàng)建子進(jìn)程1*/

        child1=fork();

        if(child1==1)

        {

        perror(child1fork);

        exit(1);

        }

        elseif(child1>0)

        {

        exit(0);/*父進(jìn)程退出*/

        }

        /*打開日志服務(wù)*/

        openlog(daemon_proc_info,LOG_PID,LOG_DAEMON);

        /*以下幾步是編寫守護(hù)進(jìn)程的常規(guī)步驟*/

        setsid();

        chdir(/);

        umask(0);

        for(i=0;igetdtablesize();i++)

        {

        close(i);

        }

        /*創(chuàng)建子進(jìn)程2*/

        child2=fork();

        if(child2==1)

        {

        perror(child2fork);

        exit(1);

        }

        elseif(child2==0)

        {/*進(jìn)程child2*/

        /*在日志中寫入字符串*/

        syslog(LOG_INFO,child2willsleepfor10s);

        sleep(10);

        syslog(LOG_INFO,child2isgoingtoexit!);

        exit(0);

        }

        else

        {/*進(jìn)程child1*/

        waitpid(child2,NULL,0);

        syslog(LOG_INFO,child1noticedthatchild2hasexited);

        /*關(guān)閉日志服務(wù)*/

        closelog();

        while(1)

        {

        sleep(10);

        }

        }

        }

        (3)由于有些嵌入式開發(fā)板沒有syslog服務(wù),讀者可以在宿主機(jī)上編譯運(yùn)行。

        $gccdaemon_proc.c–odaemon_proc(或者使用Makefile)

        (4)運(yùn)行該程序。

        (5)等待10s后,以root身份查看系統(tǒng)日志文件(例如“/var/log/messages”)。

        (6)使用ps–ef|grepdaemon_proc查看該守護(hù)進(jìn)程是否在運(yùn)行。

        4.實(shí)驗(yàn)結(jié)果

        (1)在系統(tǒng)日志文件中有類似如下的信息顯示:

        Jul2021:15:08localhostdaemon_proc_info[4940]:child2willsleepfor10s

        Jul2021:15:18localhostdaemon_proc_info[4940]:child2isgoingtoexit!

        Jul2021:15:18localhostdaemon_proc_info[4939]:child1noticedthatchild2hasexited

        讀者可以從時(shí)間戳里清楚地看到child2確實(shí)暫停了10s。

        (2)使用命令ps–ef|grepdaemon_proc可看到如下結(jié)果:

        david49391021:15?00:00:00./daemon_proc

        可見,daemon_proc確實(shí)一直在運(yùn)行。

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 九龙城区| 道真| 朔州市| 广饶县| 武强县| 岳阳县| 浑源县| 丰城市| 枣阳市| 垣曲县| 逊克县| 方正县| 罗甸县| 莱西市| 沾化县| 盐城市| 临安市| 阜城县| 理塘县| 新津县| 青州市| 安多县| 兰溪市| 泽普县| 蒙城县| 安西县| 丰镇市| 崇阳县| 南京市| 香格里拉县| 高密市| 西安市| 凉山| 克什克腾旗| 镇安县| 大埔区| 绥中县| 双鸭山市| 胶州市| 南陵县| 从化市|