守护进程的模拟实现(daemon)
来源:互联网 发布:usb共享电脑网络给手机 编辑:程序博客网 时间:2024/05/22 14:19
一、什么是守护进程
守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊进程。他独立与控制终端并且周期性的执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。
Linux的大多数服务器就是用守护进程实现的 比如:Internet服务器 inetd,Web服务器httpd等同时守护进程完成许多系统任务。比如:作业规划进程crond等。
Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能和用户直接交互,其他进程都是在用户登录或运行程序时创建的,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,他们一直在运行着,这种进程有一个名称叫守护进程(Daemon)
二、守护进程有哪些特点
- 守护进程的PPID为1(init)
- 所有守护进程自称会话(PID PGID SID(会话ID)基本都一样)
- 守护进程自成一派互不影响,不受用户登录与终端关闭的影响。
- 守护进程都为孤儿进程,他们的父进程为1(init)
- 是运行在后台的一种特殊进程
- 凡是TPGID一栏写着 -1 的都是没有控制终端的进程,也就是守护进程
7.COMMAND一列用 [] 括起来的,名字表示内核线程
三、守护进程的模拟实现
创建守护进程最关键的一步是调用setsid()函数创建一个新的Session(会话),并且为Session Leader
头文件:
#include<unistd.h>pid_t setsid(void);
1、守护进程模拟实现代码块
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<signal.h>//信号头文件 4 void mydaemon() 5 { 6 umask(0);//1、将文件模式创建屏蔽字设置为0 7 if(fork() > 0) 8 {//father //2、调用fork(),然后让父进程退出(exit(0);) 原因1)如果该守护进 程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已 经执行完毕。2)保证子进程不是一个进程组的组长进程 9 exit(0); 10 } //child 11 setsid();//3、创建一个新会话。setsid会导致:1)调用进程会成为新会话的首进程。 2)调用进程成为一个进程组的组长进程 3)调用进程没有控制终端 (再次fork(),保证daemon进程,之后不会打开tty设备) 12 chdir("/");//4、将当前工作目录更改为根目录 13 close(0);//5、关闭不再需要的文件描述符 14 close(1); 15 close(2); 16 signal(SIGCHLD,SIG_IGN);//6、忽略SIGCHLD(子进程信号)信号 17 } 18 19 int main() 20 { 21 mydaemon(); 22 while(1); 23 return 0;}
2、Makefile文件
1 mydaemon : mydaemon.c 2 gcc -o $@ $^ -g -lpthread 3 .PHONY:clean 4 clean: 5 rm -f mydaemon
3、运行结果
四、创建守护进程的专用函数
int daemon(int nochdir, int noclose);//也可以用该函数创建一个守护进程
阅读全文
0 0
- 守护进程的模拟实现(daemon)
- Python实现Daemon(守护)进程
- Python守护进程daemon实现
- Daemon守护进程的管理
- Linux下一个简单守护进程的实现 (Daemon)
- Linux下一个简单守护进程的实现 (Daemon)
- Linux下一个简单守护进程的实现 (Daemon)
- 用perl实现守护进程(daemon)代码
- python中的daemon守护进程实现方法
- Linux系统的守护进程(Daemon Process)
- 守护进程Daemon是怎样练成的!
- UNIX下守护进程(Daemon)的编写
- 守护进程(Daemon)的编写
- 守护进程的制作(daemon)
- 守护进程daemon的创建和使用
- Linux daemon守护进程的创建
- 守护进程daemon的创建和使用
- 守护进程(Daemon)
- SQL 的 IFNULL 关键字的用法
- 类什么情况下不可以被继承
- 软件工程第二章知识点总结
- 写给大数据开发初学者的话2
- ExpandableListView动态编辑 item出现convertView 复用错乱问题
- 守护进程的模拟实现(daemon)
- smtplib发送带SSL认证的邮箱系统
- Redis与Memcached的区别
- 树状数组 Ultra-QuickSort 离散化+逆序数
- 关于Android退出程序清空私密文件的那些事
- ubuntu 8000端口被占用
- Nginx负载均衡的4种方案配置实例
- Shadowsocks non-UI Error解决办法
- vi和vim的区别