Linux C/C++编程之(十九)进程组守护进程
文章目录
- 一、概述
- 二、进程组与守护进程
- 1. 进程组
- 2. 进程组操作函数
- 3. 会话
- 4. 守护进程
一、概述
二、进程组与守护进程
1. 进程组
进程组,也称之为作业。BSD于1980年前后向Unix中增加的一个新特性,代表一个或多个进程的集合,每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了简化对多个进程的管理。
当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID第一个进程ID(组长进程)。所以,组长进程标识:**其进程组ID其进程ID**
组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。可以使用 kill -SIGKILL -进程组ID(负的)
来将整个进程组内的进程全部杀死。
进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)。
一个进程可以为自己或子进程设置进程组ID
2. 进程组操作函数
1)getpgrp函数
- 获取当前进程的进程组ID
- 总是返回调用者的进程组ID
2)getpgid函数
- 获取指定进程的进程组ID
- 成功:返回进程组ID;失败:-1,设置errno
3)setpgid函数
- 改变进程默认所属的进程组。通常可用来加入一个现有的进程组或创建一个新进程组。
注意:
- 如改变子进程为新的组,应fork后,exec前。
- 权级问题。非root进程只能改变自己创建的子进程,或有权限操作的进程
3. 会话
1)创建会话
创建一个会话需要注意以下6点注意事项:
a. 调用进程不能是进程组组长,该进程变成新会话首进程(session header)
b. 该进程成为一个新进程组的组长进程。
c. 需有root权限(ubuntu不需要)
d. 新会话丢弃原有的控制终端,该会话没有控制终端
e. 该调用进程是组长进程,则出错返回
f. 建立新会话时,先调用fork, 父进程终止,子进程调用setsid
2)getsid函数
获取进程所属的会话ID
- pid为0表示察看当前进程session ID
- ps ajx命令查看系统中的进程
- 参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,
- 参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,
- 参数j表示列出与作业控制相关的信息。
组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程。
3)setsid函数
创建一个会话,并以自己的ID设置进程组ID,同时也是新会话的ID。
调用了setsid函数的进程,既是新的会长,也是新的组长。
总结:
- 会话:进程组的更高一级,多个进程对应一个会话。
- 进程组:多个进程在同一个组,第一个进程默认是进程组的组长。
- 创建会话的时候,组长不可以创建,必须是组员创建。
- 创建会话的步骤:创建子进程,父进程去死,子进程自当会长。
4. 守护进程
Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。
创建守护进程,最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。
- 创建守护进程模型:
1)创建子进程,父进程退出
所有工作在子进程中进行,形式上脱离了控制终端
2)在子进程中创建新会话
setsid()函数使子进程完全独立出来,脱离控制
3)改变当前目录为根目录
chdir()函数防止占用可卸载的文件系统也可以换成其它路径
4)重设文件权限掩码
umask()函数防止继承的文件创建屏蔽字拒绝某些权限增加守护进程灵活性
5)关闭文件描述符
继承的打开文件不会用到,浪费系统资源,无法卸载开始执行守护进程核心工作守护进程退出处理程序模型
总结:
守护进程的步骤:
a. 创建子进程fork
b. 父进程退出
c. 子进程当会长 setid
d. 切换工作目录 $HOME
e. 设置掩码 umask
f. 关闭文件描述符 0, 1, 2,为了避免浪费资源
g. 执行核心逻辑
h. 退出
没创建家目录下的log,所以改成了家目录
Linux C/C++编程之(十九)进程组守护进程相关推荐
- linux 会话 进程组 守护进程
Linux 下每个进程都会有一个非负整数表示的唯一进程 ID ,简称 pid . Linux 提供了 getpid 函数来获取 进程的 pid ,同时还提供了 getppid 函数来获取父进程的 pi ...
- [笔记]Windows核心编程《十九》DLL基础
系列文章目录 [笔记]Windows核心编程<一>错误处理.字符编码 [笔记]Windows核心编程<二>内核对象 [笔记]Windows核心编程<三>进程 [笔记 ...
- 【linux草鞋应用编程系列】_2_ 环境变量和进程控制
一. 环境变量 应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作. 在linux中有两种方法获取环境变量,分述如下. 1.通过main函数的参数获取环境变量 main函数的多种 ...
- 【Linux系统编程】特殊进程之守护进程
00. 目录 文章目录 00. 目录 01. 守护进程概述 02. 守护进程查看方法 03. 编写守护进程的步骤 04. 守护进程代码 05. 附录 01. 守护进程概述 守护进程(Daemon Pr ...
- CSDN 编程竞赛十九期题解
竞赛总览 CSDN 编程竞赛十九期:比赛详情 (csdn.net) 竞赛题解 题目1.幼稚班作业 幼稚园终于又有新的作业了.老师安排同学用发给同学的4根木棒拼接成一个三角形.当然按照正常的逻辑,如果不 ...
- 《UNIX环境高级编程》笔记 第十三章-守护进程
1. 概念 守护进程(daemon)是生存期长的一种进程.它们常常在系统引导装入时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的. Linux的大多数服务就是用守护进程实现 ...
- Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)
进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...
- Linux | 进程概念、进程状态(僵尸进程、孤儿进程、守护进程)、进程地址空间
文章目录 进程和程序 操作系统如何控制和调度程序 进程控制块–PCB 子进程 进程状态 僵尸进程 孤儿进程 守护进程(精灵进程) 进程地址空间 引言 页表 进程和程序 程序: 一系列有序的指令集合(就 ...
- python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...
前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程.锁.信号量. 友情链接: 一.守护进程(daemon) 1.1 守护进程概念 首先我们都知道:正常情况下,主进程默认等待子进程 ...
最新文章
- wifi拥挤时防掉线小技巧
- 【全球AI人才排行榜】美国第一,中国仅排名第7
- SAP Spartacus 中 Angular json pipe 的工作原理
- C# override详解
- ie浏览器网页版进入_IE浏览器打开网页速度很慢的解决办法
- Linux自动化运维第十八课
- 第二周Python笔记 数据类型 字典
- [转载]DB2数据库移植罕见结果周全理会(3)
- 《QQ欢乐斗地主》山寨版
- 阿里十大最受开发者欢迎的工具!
- 约4万个外国人名,中英对照
- Web 方向学习路线
- 仿真建模与仿真程序设计 Python
- 关于QComboBox
- postman安装html插件安装,Postman 安装与更新
- Linux与windows常用软件大比拼
- 关于PWM脉冲宽度调制的点滴总结
- 通过C2prog用JTAG烧写28027
- android平台开发板外接罗技C525摄像头不支持扫码有什么办法解决
- 给真的想【卷】的你们
热门文章
- 图片上传,预览以及图片删除
- Contacts和RawContacts的区别
- NPDP认证|产品经理首先必须是点子专家?
- SQL server 2012 附加数据库
- 使用mvc架构模式实现账户之间的转账(没有涉及事务处理)
- 基于Eureka实现服务注册中心
- Uncaught SyntaxError: Invalid or unexpected token
- Mybatis 中 sql 之 大于,等于,不等于...
- SOME/IP和DDS
- JZOJ 5988 珂学计树题 【树-括号序列-01序列+Burnside引理】