这里首先假设读者知道守护进程的大概概念,下面我们直接看程序。
//****************
环境,OS = Ubuntu 10.4 编译器 = gcc 4.5.2
******************//
- int main(int argc, char **argv)
- {
- //因为下面要关掉某些信号,所以需要
- struct sigaction sa;
- int i, fd, fdtablesize;
- //上来第一件事,调用umask将文件模式创建屏蔽字设置为0,为的是防止守护进程可能不具有对文件读写的权限
- umask(0);
- //设置信号处理函数,SIG_IGN为忽略信号
- sa.sa_handler = SIG_IGN;
- //sa.sa_mask这个成员的清零,一定要使用sigemtpy函数
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = 0;
- //对以下几种信号做忽略处理
- sigaction(SIGTTOU, &sa, NULL);
- sigaction(SIGTTIN, &sa, NULL);
- sigaction(SIGTSTP, &sa, NULL);
- sigaction(SIGUP, &sa, NULL);
- //关闭父进程,使子进程成为孤儿进程,从而被init收养
- if(fork() != 0)
- {
- exit(1);
- }
- //创建一个新会话
- if(setsid() < 0)
- {
- exit(1);
- }
- //第二次退出父进程
- if(fork() != 0)
- {
- exit(1);
- }
- //改变工作路径到root,防止出现工作目录被卸载的情况
- if(chidr("/") == -1)
- {
- exit(1);
- }
- //关闭打开的文件描述符,包括标准输入输出和标准出错
- for(fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)
- {
- close(fd);
- }
- //再次关掉信号
- sigaction(SIGCHLD, &sa, NULL);
- //进入一个死循环让守护进程常驻内存
- while(1)
- {
- //do somthing
- sleep(1);
- }
- //至此就完成了对一个守护进程的初始化
- return 0;
- }
本文深入解析了守护进程的初始化过程,包括如何设置信号处理、关闭文件描述符、改变工作路径等关键步骤,确保守护进程在后台稳定运行。


被折叠的 条评论
为什么被折叠?



