Linux系统编程(六)守护进程

  • 一、进程组
    • 概念
  • 二、会话
    • 创建会话的条件
  • 守护进程
    • 概念
    • 守护进程模型
  • 创建守护进程

一、进程组

概念

进程组,也称之为作业。代表一个或多个进程的集合。每个进程都属于一个进程组。
当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID == 第一个进程ID(组长进程)。所以,组长进程标识:其进程组ID == 其进程ID
组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。
进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)。
一个进程可以为自己或子进程设置进程组ID

二、会话

创建会话的条件

  1. 调用进程不能是进程组组长,该进程变成新会话首进程(session header)
  2. 该进程成为一个新进程组的组长进程。
  3. 需有root权限(ubuntu不需要)
  4. 新会话丢弃原有的控制终端,该会话没有控制终端
  5. 该调用进程是组长进程,则出错返回
  6. 建立新会话时,先调用fork, 父进程终止,子进程调用setsid

守护进程

概念

Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。
创建守护进程,最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。

守护进程模型

  1. 创建子进程,父进程退出
    所有工作在子进程中进行形式上脱离了控制终端
  2. 在子进程中创建新会话
       setsid()函数
       使子进程完全独立出来,脱离控制
  3. 改变当前目录为根目录
       chdir()函数
       防止占用可卸载的文件系统
       也可以换成其它路径
  4. 重设文件权限掩码
       umask()函数
       防止继承的文件创建屏蔽字拒绝某些权限
       增加守护进程灵活性
  5. 关闭文件描述符
       继承的打开文件不会用到,浪费系统资源,无法卸载
  6. 开始执行守护进程核心工作
  7. 守护进程退出处理程序模型

创建守护进程

#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include<time.h>
#include <errno.h>
#include <sys/time.h>
#include <memory.h>void handler(int signo)
{time_t now;    //实例化time_t结构struct tm* timenow;    //实例化tm结构指针time(&now);//time函数读取现在的时间(国际标准时间非北京时间),然后传值给nowtimenow = localtime(&now);//localtime函数把从time取得的时间now换算成你电脑中的时间(就是你设置的地区)char buf[50] = {0};sprintf(buf,"%s\n" ,asctime(timenow));int fd;fd = open("./time.txt", O_CREAT | O_RDWR,0644);if (fd == -1){perror("file error:");exit(1);}lseek(fd, 0, SEEK_END);int ret=write(fd,buf,sizeof(buf));if (ret < 0 && errno == EINTR){perror("write error:");}memset(buf,0,sizeof(buf));printf("write success \n");}void mydaemond(void)
{pid_t pid, sid;int ret;pid = fork();if (pid < 0){perror("pid error:");exit(1);}else if (pid == 0){sid = setsid();if (sid == -1){perror("sid error:");exit(1);}//ret = chdir("/home/");//if (ret < 0)//{//    perror("chdir error:");//    exit(1);//}umask(0002);//关闭文件描述符close(STDIN_FILENO);open("/dev/null", O_RDWR);dup2(0, STDOUT_FILENO);dup2(0, STDERR_FILENO);//安装信号struct sigaction act;act.sa_flags = 0;sigemptyset(&act.sa_mask);act.sa_handler = handler;sigaction(SIGALRM, &act, NULL);itimerval it;it.it_interval.tv_sec = 2;it.it_interval.tv_usec = 0;it.it_value.tv_sec = 2;it.it_value.tv_usec = 0;//启用时间setitimer(ITIMER_REAL, &it, NULL);}else{exit(1);}
}int main()
{mydaemond();while (1);return 0;
}

使用守护进程实现每两秒打印当前时间到文件中

Linux系统编程(六)守护进程相关推荐

  1. 【Linux系统编程】守护进程、线程

    ------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1.守护进程 1.1 进程组 1.2 会话 1.3 setsid()函数 ...

  2. Linux系统编程之--守护进程的创建和详解【转】

    本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...

  3. 【Linux系统编程】特殊进程之守护进程

    00. 目录 文章目录 00. 目录 01. 守护进程概述 02. 守护进程查看方法 03. 编写守护进程的步骤 04. 守护进程代码 05. 附录 01. 守护进程概述 守护进程(Daemon Pr ...

  4. Linux -- 多进程编程之 - 守护进程

    内容概要 一.守护进程概述 二.守护进程创建 2.1.创建子进程,父进程退出 2.2.在子进程中创建新会话 2.2.1.进程组和会话期 2.2.2.setsid()函数说明 2.3.改变当前工作目录 ...

  5. 【Linux系统编程】特殊进程之孤儿进程

    00. 目录 文章目录 00. 目录 01. 孤儿进程概述 02. 孤儿进程代码 03. 附录 01. 孤儿进程概述 父进程运行结束,但子进程还在运行的子进程就称为孤儿进程(Orphan Proces ...

  6. 【Linux系统编程】特殊进程之僵尸进程

    00. 目录 文章目录 00. 目录 01. 僵尸进程概述 02. 僵尸进程案例 03. 避免僵尸进程 04. 附录 01. 僵尸进程概述 进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵 ...

  7. 嵌入式linux系统下简单守护进程(daemon)的编写

    最近公司项目需要,需要在我们的嵌入式linux设备中创建一个守护进程,用于保护系统中的主进程,防止某些不可预期的意外导致主进程异常结束后,系统完全宕机没有任何反应,破坏用户体验感.但是,查阅诸多资料之 ...

  8. Linux系统编程 74 孤儿进程和僵尸进程

    Linux系统编程  74 孤儿进程和僵尸进程 学习笔记 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为 init进程,称为init进程领养了孤儿进程. init进程会去接替 ...

  9. Linux系统的护花使者-----守护进程

    **************************************************************************************************** ...

  10. Linux系统编程08---守护进程与线程

    目录 作者介绍 学习目标 1 守护进程(也称Daemon 精灵进程-->是后台服务进程) 1.1 守护进程的特点 1.2 进程组和会话 1.3 创建守护进程的模型 1.4 实例:创建守护进程模型 ...

最新文章

  1. CCAI 2017 中国人工智能大会 6.4 折抢票倒计时!
  2. Spring 详解(三):AOP 面向切面的编程
  3. Index of Unix
  4. python刷阅读_用Python汇集并生成每日教育动态
  5. GitHub托管BootStrap资源汇总(持续更新中…)
  6. centos挂载windows共享目录
  7. 飞鸽传书绿色版 部分数据库被陆续公开了
  8. 02-03 Python json格式转化
  9. BFS - 求最短路径
  10. WebApi实现验证授权Token,WebApi生成文档等 - CSDN博客
  11. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
  12. ML-Visuals机器学习、深度学习绘图模板素材分享
  13. idean中jsp页面乱码_IntelliJ IDEA 控制台 乱码 有效解决办法
  14. Java Web目前主流的框架以及正在兴起的框架
  15. 拼多多爆款选择要分析哪些数据?如何采集这些爆款到拼多多?
  16. 利用官方预训练模型快速计算Inception Score和FID
  17. html 操作cookie,HtmlUnit 模拟浏览器以及Cookie使用示例
  18. python找不同_用Python玩大家来找茬
  19. 通讯录总结-JAVA GUI- “婉君被通讯录吓晕”-第一版
  20. Android输入事件从读取到分发三:InputDispatcherThread线程分发事件的过程

热门文章

  1. 字符串匹配(KMP 算法 含代码)
  2. EasyRMS录播管理服务器项目实战:windows上开机自启动NodeJS服务
  3. awk用法小结(作者总结)
  4. 为了适应云数据库mySQL产品_为了适应不同的应用场景,云数据库mysql版提供的产品系列包括哪些...
  5. 自动论文生成器 python_Python生成器常见问题及解决方案
  6. matlab如何测两点的角度_【邢不行|量化小讲堂系列01-Python量化入门】如何快速上手使用Python进行金融数据分析...
  7. 虚拟机 java 开发_深入浅出 Java 虚拟机 · 通往高级 Java 开发的必经之路
  8. java三板斧_Java 枚举使用三板斧
  9. 按键 粘贴上一个命令_合并单元格、选择性粘贴的快捷键都是啥?今天一次告诉你……...
  10. linux c实现一个简单的sniffer