标题:
嵌入式系统中守护进程的编写及调试
[打印本页]
作者:
wxg1988
时间:
2013-11-6 22:48
标题:
嵌入式系统中守护进程的编写及调试
守护进程是Linux系统开发中很重要的知识点,很多朋友对这个问题掌握的不是很深入,今天我就写写这方面的问题,可以帮助大家熟悉守护进程的编写过程。
守护进程编写的主要步骤如下:
1
.屏蔽一些有关控制终端操作的信号。防止在守护进程没有正常运转起来时,控制终端受到干扰退出或挂起。
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP ,SIG_IGN);
2.
将
程序
进入后台执行。由于守护进程最终脱离控制终端,到后台去运行。方法是在进程中调用
fork
使父进程终止,让
Daemon
在子进程中后台执行。这就是常说的
“
脱壳
”
。子进程继续函数
fork()
的定义如下:
pid_t fork(void);
3.
脱离控制终端、登录会话和进程组。开发人员如果要摆脱它们,不受它们的影响,一般使用
setsid()
设置新会话的领头进程,并与原来的登录会话和进程组脱离。
4.
禁止进程重新打开控制终端。
5.
关闭打开的文件描述符,并重定向标准输入、标准输出和标准错误输出的文件描述符。进程从创建它的父进程那里继承了打开的文件描述符。如果不关闭,将会浪费系统资源,引起无法预料的错误。关闭三者的代码如下:
for (fd = 0, fdtablesize = getdtablesize();
fd < fdtablesize; fd++)
close(fd);
6.
改变工作目录到根目录或特定目录进程活动时,其工作目录所在的文件系统不能卸下
7.
处理
SIGCHLD
信号。
SIGCHLD
信号是子进程结束时,向内核发送的信号。如果父进程不等待子进程结束,子进程将成为僵尸进程(
zombie
)从而占用系统资源。因此需要对
SIGCHLD
信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。可以用如下语句:
signal(SIGCHLD,(void *)reap_status);
捕捉信号
SIGCHLD
,用下面的函数进行处理:
void reap_status()
{ int pid;
….
}
程序:
init
.
c test.c
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0