简介

守护进程是一种运行在后台的特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件
其实,本质上守护进程和普通的进程并没有什么区别,只是我们规定了一种进程的编写规则,将其叫做守护进程,仅此而已。

特点

1. 在后台运行

为了不让其阻塞终端,我们用fork()创建子进程,然后退出父进程,就可以完成在后台运行的目的。

2. 脱离控制终端,创建新的会话组和进程组

简单说一下会话、进程、进程组以及控制终端的关系。多个进程构成进程组,多个进程组构成一个会话,会话可以有一个控制终端
此时我们的会话进程组等都是由父进程继承来的,我们要与之脱离,不受其影响。
方法是调用setsid();成功返回0,失败返回-1。
执行成功后会为当前进程创建会话组并成为该会话组的组长,当然也是新的进程组的组长了。
当调用者本身就是会话组长时会失败。

3. 使其不再是会话组长,用以禁止其打开终端

仍然是通过fork()产生子进程,然后退出父进程来做到这一点

4. 关闭已经打开文件描述符

这里的作用是避免对资源的占用

for(int i=0; i<NOFILE; i++)close(i);
//NOFILE所属头文件是 <sys/param.h>

5. 更改当前工作目录

原因很简单,比如你讲工作目录设在了/home/aaa下,现在你要删掉aaa,是删不掉的,因为守护进程在运行过程中,是依赖于aaa这个目录的。
通常需要将工作目录设为根,根据特定情况而定。

    chdir("/")

6. 重设文件掩码

使文件操作权限不再受父进程影响
直接将其设为0即可。
umask(0);
这里强调一点,umask函数里的参数,我们平时使用的比如0666,第一位的0只是表示0666是一个八进制的数,没有别的含义。与umask命令略有区别

7. 处理信号(非必须)

signal(SIGCHLD, SIG_IGN);

忽略SIGCHLD信号,常用于并发服务器的性能提升。因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设为忽略,内核就会把僵尸子进程转交给init进程去处理,避免了大量僵尸进程对系统资源的占用。

代码

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>#define DIR "/Users/shiyi/Desktop"
#define TMP_TXT "/Users/shiyi/Desktop/tmp.txt"void init_daemon()
{//转为后台进程int pid = fork();if(pid < 0)exit(1);else if(pid != 0)exit(0);//开启新的会话组,成为会话组长和进程组长setsid();//使其不再是会话组长,不能开启终端pid = fork();if(pid < 0)exit(1);else if(pid != 0)exit(0);//关闭已经打开的文件描述符,避免浪费系统资源for(int i=0; i<NOFILE; i++)close(i);//更改工作目录chdir(DIR);//重设文件掩码,使文件操作权限不再受父进程影响umask(0000);//重定向输入输出int fd = open(TMP_TXT, O_CREAT | O_RDWR, 0644);if(fd < 0)exit(2);dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);close(fd);//忽略SIGCHLD信号,避免大量僵尸进程占用系统资源signal(SIGCHLD, SIG_IGN);
}int main()
{//创建守护进程init_daemon();time_t t;char str[30];      for(int i=0; i<10; i++){time(&t);strcpy(str, ctime(&t));str[strlen(str)-1] = '\0';printf("%s : 当前是第%d次循环\n", str, i);fflush(NULL);sleep(1);}return 0;
}

测试结果

linux之创建守护进程相关推荐

  1. 黑马程序员Linux系统开发视频之创建守护进程模型

    黑马程序员Linux系统开发视频之创建守护进程模型 1.创建子进程,父进程退出   所有工作在子进程中进行形式上脱离了控制终端 2.在子进程中创建新会话   setsid()函数   使子进程完全独立 ...

  2. ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

    前言 在上篇文章中<ASP.NET Core Docker部署>中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或 ...

  3. Linux系统编程---11(会话,守护进程,创建守护进程)

    会话 创建会话 创建一个会话需要注意以下6点注意事项 调用进程不能是进程组组长,该进程变成新会话首进程 该进程成为一个新进程组的组长进程 需要root权限(nbuntu不需要) 新会话丢弃原有的控制终 ...

  4. Linux创建守护进程

    守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务 ...

  5. 【Linux编程】守护进程(daemon)详解与创建

    本文主要参考自:linux系统编程之进程(八):守护进程详解及创建,daemon()使用 一.概述 Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处 ...

  6. C语言实现Linux系统的守护进程创建

      大家好,我是练习编程时长两年半的昆工第一ikun,今天我们来分享一下进程的有关知识,并且用c语言来创建一个Linux系统的守护进程. 目录 一.进程相关接口函数 1.创建子进程 -- fork ( ...

  7. linux怎么监控守护进程,linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

  8. python 守护程序检测进程是否存在_python创建守护进程的疑问

    我自己写了一个简易的下载和文件执行的客户端,如下 """ 省略若干代码 """ #执行下载函数 def do_script(): " ...

  9. ora03135连接失去联系 进程id 0_进程组、会话、控制终端概念,如何创建守护进程?...

    守护进程 概念: 守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程.周期性的执行某种任务或等待处理某些发生的事件. Linux系统有很多守护进程,大多数服务都是用守护进程实现的 ...

最新文章

  1. 问题总结两天来两场实习面试(中科创达、华为)
  2. 盘点当下大热的 7 大 Github 机器学习『创新』项目
  3. python之开发系列
  4. 0x6A.图论 - 网络流初步
  5. SQL Server-表表达式基础
  6. dtree 无法出现横向滚动条 (clip)
  7. spark 应用场景2-身高统计
  8. Microsoft发布新工具,简化JavaScript Web应用的创建
  9. php-fpm 进程在云服务器cpu分配不均匀
  10. 探究Ubuntu如何存储用户登录密码
  11. Layui官网文档备份, Layui文档站点,LayuiAdmin
  12. 【参考】MTK线刷工具错误代码大全及解决方法
  13. CAN报文协议教程|CAN报文分析
  14. 【OpenCV】- 分水岭算法
  15. UNIAPP/微信小程序-下拉刷新的操作
  16. linux下使用第三方商店安装应用
  17. 思科—计算机网络课程设计—第八章DHCP概念测试
  18. 成都智慧工地系统_智慧工地平台指导方案
  19. FileReader读取文件的三种方式
  20. 搭建elk+logstash+kafka+filebeat日志收集平台

热门文章

  1. 轻松学习CAN总线系列---3.CAN数据遵循的格式
  2. adg不同系统_数据库ADG实施手册
  3. 使用期望等待一次性事件
  4. MFC环形进度条实现
  5. python获取招投标信息
  6. Symbian OS 开发初级手册(转)
  7. 如何才能开发一个靠谱的供应商?
  8. Oracle在中国的合作伙伴
  9. 提取pdf里关键信息到mysql
  10. 10-9 查询年龄18-20之间的学生信息(MSSQL)