您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > linux-嵌入式-守护进程编写
成绩:《嵌入式Linux应用程序开发》作业与上机实验(三)班级:12级电实班学号:14122222215姓名:邹辉任课老师:张舸完成时间:2014/10/26信息与通信工程学院2014—2015学年第1学期实验三守护进程编写一、实验目的1.熟悉Linux系统中守护进程的基本概念。2.掌握Linux系统中守护进程编写方法。二、实验内容1.建立一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。子进程退出后,守护进程循环暂停,其间隔时间为10s。2.要求子进程和守护进程的退出消息均在/var/log/messages中输出。3.画出流程图,通过编程实现。4.在实验平台上运行,记录实验过程与实验现象,并进行简单分析。三、实验参考1.守护进程创建流程图2.参考源代码/*proc_daemon.c*/#includestdio.h#includestdlib.h#includesys/types.h#includeunistd.h#includesys/wait.h#includesyslog.h#defineMAXFILE65535intmain(void){pid_tchild1,child2;inti;child1=fork()if(child1==-1)///创建守护进程{perror(child1fork);///错误处理exit(1);}elseif(child10)exit(0);openlog(exc2_info,LOG_PID,LOG_DAEMON);setsid();///在子进程中创建新的会话chdir(/);///改变当前目录为根目录umask(0);///重设文件权限掩码for(i=0;iMAXFILE;i++){close(i);}child2=fork();///在该守护进程中新建一个子进程if(child2==-1){perror(child2fork);exit(1);}elseif(child2==0){syslog(LOG_INFO,child2willsleepfor10s);///子进程暂停10ssleep(10);syslog(LOG_INFO,child2isgoingtoexit!);///子进程自动退出exit(0);}else{waitpid(child2,NULL,0);///守护进程收集子进程退出的消息syslog(LOG_INFO,child1noticedthatchild2hasexited);closelog();while(1){sleep(10);///子进程退出后,守护进程循环暂停,其间隔时间为10s}}}四、实验步骤(1)、改变路径$cd/home/mich/shiyan/(2)、新建文件shouhu.c,使用vi编辑器进行编辑,写入代码。$vishouhu.c(3)、使用gcc编译器对源代码shouhu.c进行编译,指定生成的目标文件名为shouhu,输入命令如下。$gccshouhu.c-oshouhu如终端提示错误信息,则应返回2.1仔细检查和修改源代码,直到编译产生目标文件shouhu为止,记录源代码错误部分的修改内容,并分析原因。(4)、查看目标文件shouhu属性,输入命令如下。$ls-l(5)、如shouhu无可执行权限,则需添加可执行权限,输入命令如下。$chmoda+xshouhu(6)、执行shouhu,输入命令如下。$./shouhu如运行结果未达到图一所示,则返回2.1按顺序重复进行源代码编辑和编译操作,直到运行结果达到预计要求为止,记录具体修改过程和实验运行结果。(7)、源代码交叉编译使用交叉编译工具链arm-linux-gcc对源代码shouhu.c进行编译,指定生成的可以在实验平台上运行的目标文件名为shouhu_a,输入命令如下。$arm-linux-gccshouhu.c-oshouhu_a(8)、复制shouhu_a到FTP服务器vsftpd的默认路径,输入命令如下。$cpshouhu_a/home/ftp(9)、配置Ubuntu的IP地址与实验平台为同一网段。实验平台固化IP地址为192.168.10.145,为便于以下的说明,假设实验者配置Ubuntu的IP地址为192.168.10.100。(10)、由于实验平台上仅有/var为可读写路径,因此首先必须切换工作路径至/var,输入命令如下。#cd/var(11)、利用网络将交叉编译生成的目标文件shouhu_a下载至实验平台,输入以下命令登录FTP服务器。#ftp192.168.10.100进入FTP服务器后按照提示,输入用户名ftp,密码ftp。(12)、下载shouhu_a到本地,输入FTP内部命令如下。getshouhu_a/var/shouhu_a(13)、待文件传输完成后断开FTP连接,输入FTP内部命令如下。quit(14)、查看目标文件shouhu_a属性,输入命令如下。#ls-l检查实验平台的/var/shouhu_a与Ubuntu的/home/ftp/teat_a文件大小是否一致,如不一致,则需重新登录FTP服务器进行下载。(15)、如shouhu_a无可执行权限,则需添加可执行权限,输入命令如下。#chmoda+xshouhu_a(16)、执行shouhu,输入命令如下。#./shouhu_a(17)、启动syslogd的守护进程,通过syslog记录事件,输入命令如下。#syslog(18)、再次执行shouhu,输入命令如下。#./shouhu_a(19)、改变路径#cd/var/log(19)、查看系统日志文件#vimessages如果在实验平台的显示器上显示如图一所以结果,则实验成功;图一正确记录五、思考题1.说明创建一个守护进程的基本过程。答:(1).创建子进程,父进程退出(2).在子进程中创建新的会话调用setsid()函数,作用有三个,让进程摆脱原会话的控制;让进程摆脱原进程组的控制;让进程摆脱原控制终端的控制,这里需要介绍进程组和会话组的概念;进程组:是一个或多个进程的集合,由进程组ID来唯一标识,进程组组长的进程号等于该进程组的ID,且组长进程的退出不会影响该ID。会话组:由一个或多个进程组构成,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话。虽然经过第一步,但是子进程完全拷贝父进程的东西,导致,原先的会话期,进程组,控制终端没有变化,因此,还不算真正的脱离开来,而setsid()函数可以让进程完全独立开来。(3).改变当前目录为根目录使用fork创建的子进程继承了父进程的工作目录,导致当前工作目录不能卸载,可能造成一些麻烦通常都是让根目录为守护进程的当前目录,用函数chdir();(4).重设文件权限掩码文件权限掩码指屏蔽掉文件权限中的对应位,比如一个文件的权限掩码是050,就屏蔽了文件组拥有者的可读和可执行权限,子进程继承了父进程的一切东西,当然也包括权限掩码,导致子进程是用文件有诸多麻烦,因此把文件权限掩码设置为零,就可以增加该守护进程的灵活性。(5).关闭文件描述符同权限掩码一样,子进程继承了父进程的一些打开的文件,这些文件可能子进程永远也用不到,但是它们一样消耗系统资源,而且导致所在的文件系统无法卸载。2.说明setsid函数的作用。进程从它的双亲进程获得它的对话过程和进程组识别号。setsid()就是将进程和它当前的对话过程和进程组分离开,并且把它设置成一个新的对话过程的领头进程。3.列举出守护进程编写过程中使用syslog服务的注意事项。答:syslog是Linux中的系统日志管理服务,通过守护进程syslogd来维护。使用时,要先在运行程序之前需要在输入命令“syslog”开启向日志文件中写入消息的服务,不然日志文件中就没有进程的具体消息,上次我做实验时第一次没有输入该命令,结果在指定目录下就没有日志文件。
本文标题:linux-嵌入式-守护进程编写
链接地址:https://www.777doc.com/doc-4788934 .html