Daemon(精灵)进程,是linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
linux后台的一些服务进程,没有控制终端,不能直接和用户交互,不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如预读入缓输出机制的实现:ftp服务器、nfs服务器等。
chdir()函数头文件 #include<unistd.h> |原型:int chdir(const char *path);
umask()函数头文件 #include<sys/types.h>#include<sys/stat.h>|原型:mode_t umask(mode_t mask);
创建守护进程模型
- 创建子进程,父进程退出,所有工作在子进程中进行形式上脱离了控制终端
- 子进程中创建新会话,使用setsid()函数、使子进程完全独立出来,脱离控制
- 改变当前目录为根目录或其他目录,使用chdir()函数、防止占用可卸载的文件系统
- 重设文件权限掩码,使用umask()函数、防止继承的文件创建拒绝某些权限
- 关闭文件描述符,0:标准输入、1:标准输出、2:标准出错
- 开始执行守护进程核心工作
- 守护进程退出处理程序模型
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/stat.h>
4 #include<unistd.h>
5 #include<fcntl.h>
6 #include<stdlib.h>
7 void mydaemond(void)
8 {
9 pid_t pid,sid;
10 int ret;
11 pid = fork();
12 if(pid==-1){
13 perror("fork error\n");
14 }
15 if(pid>0){
16 exit(0);
17 }
18 sid = setsid();
19 if(sid==-1){
20 perror("setsid error\n");
21 }
22 ret=chdir("/home/bobo/linux-signal-code");
23 if(ret==-1){
24 perror("chdir error\n");
25 }
26 umask(0022);
27 close(STDIN_FILENO);
28 open("/dev/null",O_RDWR);
29 dup2(0,STDOUT_FILENO);
30 dup2(0,STDERR_FILENO);
31
32 }
33 void main(void)
34 {
35 mydaemond();
36 while(1);
37 }