进程控制开发之:实验内容

时间:2013-09-13来源:网络

7.4.2编写守护进程

1.实验目的

通过编写一个完整的守护进程,使读者掌握守护进程编写和调试的方法,并且进一步熟悉如何编写多进程程序。

2.实验内容

在该实验中,读者首先建立起一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。在这里,子进程和守护进程的退出消息都在系统日志文件(例如“/var/log/messages”,日志文件的全路径名因版本的不同可能会有所不同)中输出。子进程退出后,守护进程循环暂停,其间隔时间为10s。

3.实验步骤

(1)画出该实验流程图。

该程序流程图如图7.9所示。

图7.9实验7.4.2流程图

(2)实验源代码。

具体代码设置如下:

/*daemon_proc.c*/

#includestdio.h>

#includestdlib.h>

#includesys/types.h>

#includeunistd.h>

#includesys/wait.h>

#includesyslog.h>

intmain(void)

{

pid_tchild1,child2;

inti;

/*创建子进程1*/

child1=fork();

if(child1==1)

{

perror(child1fork);

exit(1);

}

elseif(child1>0)

{

exit(0);/*父进程退出*/

}

/*打开日志服务*/

openlog(daemon_proc_info,LOG_PID,LOG_DAEMON);

/*以下几步是编写守护进程的常规步骤*/

setsid();

chdir(/);

umask(0);

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

{

close(i);

}

/*创建子进程2*/

child2=fork();

if(child2==1)

{

perror(child2fork);

exit(1);

}

elseif(child2==0)

{/*进程child2*/

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

syslog(LOG_INFO,child2willsleepfor10s);

sleep(10);

syslog(LOG_INFO,child2isgoingtoexit!);

exit(0);

}

else

{/*进程child1*/

waitpid(child2,NULL,0);

syslog(LOG_INFO,child1noticedthatchild2hasexited);

/*关闭日志服务*/

closelog();

while(1)

{

sleep(10);

}

}

}

(3)由于有些嵌入式开发板没有syslog服务,读者可以在宿主机上编译运行。

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

(4)运行该程序。

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

(6)使用ps–ef|grepdaemon_proc查看该守护进程是否在运行。

4.实验结果

(1)在系统日志文件中有类似如下的信息显示:

Jul2021:15:08localhostdaemon_proc_info[4940]:child2willsleepfor10s

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

Jul2021:15:18localhostdaemon_proc_info[4939]:child1noticedthatchild2hasexited

读者可以从时间戳里清楚地看到child2确实暂停了10s。

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

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

可见,daemon_proc确实一直在运行。

1 2 3

关键词: 进程控制 实验 Linux 操作系统

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版