进程控制开发之:实验内容
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确实一直在运行。
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码