本文内容:

1.守护进程的定义

2.守护进程的作用

3.守护进程的创建过程

一.守护进程的定义

1.守护进程是脱离于终端并且在后台运行的进程

2.守护进程脱离终端是为了避免在执行过程中的信息在任何终端上显示,并且不被任何终端产生的终端信息所打断

3.守护进程通常在系统引导装入时启动

二.守护进程的作用

1.守护进程是一个生存周期较长的进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些待发生的事件

2.大多数服务都是通过守护进程实现的

3.关闭终端,相应的进程都会被关闭,而守护进程却能够突破这种限制

三.守护进程的创建过程

背景知识:

1. 进程组:一个或多个进程的集合,进程组由进程组ID标识,进程组长的进程ID和进程组ID一致,并且进程组ID不会由于进程组长的退出而受到影响

2. 会话周期:一个或多个进程组的集合,比如用户从登陆到退出,这个期间用户运行的所有进程都属于该会话周期

3.setsid函数:创建一个新会话,并担任该会话组的组长,调用setsid函数的目的:让进程摆脱原会话,原进程组,原终端的控制

创建守护进程的过程:

1.创建子进程,父进程退出

子进程变成孤儿进程,然后由1号init进程收养

2.子进程创建新会话

调用setsid创建新的会话,摆脱原会话,原进程组,原终端的控制,自己成为新会话的组长

3.将当前目录改为根目录

正在运行的进程文件系统不能卸载,如果目录要回退,则此时进程不能做到,为了避免这种麻烦,以根目录为当前目录

4.重设文件权限掩码

子进程的文件权限掩码是复制的父进程的,不重新设置的话,会给子进程使用文件带来诸多麻烦

5.关闭不需要的文件描述符

子进程的文件描述符也是从父进程复制来的,那些不需要的文件描述符永远不会被守护进程使用,会白白的浪费系统资源,还可能导致文件系统无法结束

样例程序:守护线程每隔100s就向文件写入一句话

#include <iostream>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<semaphore.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
using namespace std; #define max_file 65535 int main()
{
pid_t pc;
int fd,len; char buf[]="this is a demo\n";
len=strlen(buf); pc=fork();//第一步,创建子进程 if(pc<0)
{
cout<<"fork error"<<endl;
exit(1);
}
else if(pc>0)
{
exit(0);//第二步,父进程退出
}
else
{
setsid();//第三步,创建新会话 chdir("/");//第四步,将当前目录改为根目录 umask(0);//第五步,重新设置文件权限掩码 for(int i=0; i<max_file; i++)
{
close(i);//第六步,关闭不需要的文件描述符
} while(1)
{
if((fd=open("/tmp/dameo.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0)
{ cout<<"open erro"<<endl;
exit(1);
}
write(fd,buf,len+1); close(fd); sleep(100);//每隔100s输出一句话到文件
}
}
}

最新文章

  1. 避免重复造轮子的UI自动化测试框架开发
  2. OO方式下,ALV TREE和ALV GRID的不同之处
  3. django 有model生成SQL以及现有反向表生成model
  4. 利用Sql实现将指定表数据导入到另一个数据库示例
  5. java.lang.UnsatisfiedLinkError: Unable to load library &#39;xxx&#39;: Native library (win32-x86-64/ID_Fpr.dll)
  6. Swift 遍历数组元素
  7. [Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)
  8. UI5_HomeWorkCompanyViewController
  9. csuoj 1355: 地雷清除计划
  10. 多线程synchronized用例解析
  11. flask 动手写的接口平台
  12. Java导出freemarker实现下载word文档格式功能
  13. VxWorks 引导程序
  14. 查看Python安装路径
  15. C#缓存absoluteExpiration、slidingExpiration两个参数的疑惑
  16. 2017.8.30 elasticsearch-sql的安装与使用
  17. ECharts概念学习系列之ECharts官网教程之在 webpack 中使用 ECharts(图文详解)
  18. Struts2学习-自动
  19. Go语言【第九篇】:Go数据结构之:数组
  20. sqli_labs第一关

热门文章

  1. 用junit Test Suite来组合测试
  2. UFUN函数 UF_CFI函数(uc4504,uc4540,uc4514,uc4547,UF_CFI_ask_file_exist )
  3. centos gcc 新版本安装的一种方法
  4. vuex基础入门
  5. Hyperspectral Images Classification Based on Dense Convolutional Networks with Spectral-Wise Attention Mechanism
  6. 【2019.11.27】SDN上机第5次作业
  7. SpringCloud Feign 常用代码
  8. 20189220 余超《Linux内核原理与分析》第二周作业
  9. 2019_软工实践_Beta(1/5)
  10. axios 文件下载代码 片段