1. 概述
守护进程(精灵进程)是一种生存期长的进程.
<1> 通常在系统引导装入时启动,在系统关闭时终止.
<2> 没有控制终端,在后台运行.
2 一些特征
<1> 所有守护进程都以超级用户(ROOT 用户ID为0)的优先权运行,
<2> 除update以外,所有守护进程都是进程组和会话期的首进程
<3> 所有守护进程的父进程都是init进程
3编程规则
<1>调用fork,结束父进程.
·若该守护进程由shell命令启动,那么父进程终止后,shell认为命令结束,终端停止.
·子进程继承父进程的进程组ID,子进程不是一个进程组的首进程.
<2>调用setsid创建一个新的会话期.
·使子进程成为新会话期的首进程,
·成为一个新进程组的首进程,
·没有控制终端
<3>将当前工作目录改为系统根目录
·当前工作目录由父进程继承而来
·若当前目录在一个装配文件系统中,则该文件系统不能被拆卸,因此需要更改当前目录.
·也可当当前工作目录修改为其他目录
<4>将文件方式创建屏蔽字设置为0
·文件方式创建屏蔽字有父进程继承的来
·此屏蔽可能会拒绝某些许可的创建,因此设置为0
<5>关闭不再需要的文件描述符
举例:
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<signal.h>
- #include<unistd.h>
- #include<stdio.h>
- #include<stdlib.h>
-
-
-
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<signal.h>
- #include<fcntl.h>
- #include <syslog.h>
-
- #define MAXF 10000
- int main()
- {
- int i,fd;
- pid_t pid;
-
- pid=fork();
- if(pid<0)
- perror("fork error!\n");
- else if(pid>0)
- exit(0);
-
-
- setsid();
- chdir("/");
- umask(0);
- for(i=1;i<MAXF;i )
- close(i);
-
-
-
- while(1)
- {
- if((fd=open("/tmp/proc.log",O_CREAT|O_WRONLY|O_APPEND))<0)
- {
- perror("open error!\n");
- exit(0);
- }
- write(fd,"Hi dameon!\n",12);
- close(fd);
- sleep(5);
- }
- }
-
-
结果:
cat命令查看/tmp/proc.log,每5秒会写入一次 Hi dameon!
若要关闭此守护进程,使用ps -e查看,再kill关闭即可
|