自己创建守护进程
2016-07-20 13:06
344 查看
创建守护进程有两种方式,一种是通过系统提供的函数实现,另一种是模仿函数的底层实现。
(一)自己创建
1.调用umask将文件模式创建屏蔽字设置为0
2.调用fork,并且父进程退出
3.调用setsid创建一个新的会话
4.将当前工作目录改成根目录。
5.关闭不再需要的文件描述符。
6.其他:忽略SIGCHLD信号
以下是自己写的守护进程:
运行结果如下:
二)调用函数的方法
#include <stdio.h>
#include<unistd.h>
int main()
{
daemon(0,0);
while(1);
}
三)关于有时候创建守护进程需要两次fork的原因
1 、第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。
2、第2次fork不是必须的。也看到很多开源服务没有fork第二次。fork第二次主要目的是。防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID
!= sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。
(一)自己创建
1.调用umask将文件模式创建屏蔽字设置为0
2.调用fork,并且父进程退出
3.调用setsid创建一个新的会话
4.将当前工作目录改成根目录。
5.关闭不再需要的文件描述符。
6.其他:忽略SIGCHLD信号
以下是自己写的守护进程:
运行结果如下:
二)调用函数的方法
#include <stdio.h>
#include<unistd.h>
int main()
{
daemon(0,0);
while(1);
}
三)关于有时候创建守护进程需要两次fork的原因
1 、第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。
2、第2次fork不是必须的。也看到很多开源服务没有fork第二次。fork第二次主要目的是。防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID
!= sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。
相关文章推荐
- 创建守护进程并且接收信号
- Linux进程间关系之守护进程
- Java注解Annotation详解
- 修改mysql密码
- createStatement()的用法
- SVM
- yaml-cpp安装
- Toolbar的背景虚化加listView头部布局置顶
- raw socket (续)
- spark 集群搭建 详细步骤
- js页面跳转
- ServletConfig&ServletContext对比
- 国内一线互联网公司内部面试题库
- Java(Android)编程思想笔记03:在Android开发中使用MVP模式
- vs2015配置opencv2.4.9问题解决
- 系统运行步骤
- Codeforces-Round-#363-Fix-a-Tree
- java基于TCP的socket数据包拆分方法
- NYOJ_123_士兵杀敌(四)插线问点
- Qualcomm平台camera调试移植入门