首页 > 系统相关 >守护进程的创建

守护进程的创建

时间:2023-02-18 15:01:54浏览次数:40  
标签:创建 ret 会话 终端 进程 操作 守护 前台

守护进程的创建

守护进程的一般概念

守护进程是挂载在后台的,因此其不因远程终端会话的关闭而结束。
并且其往往用于服务器自检和重启动,其应尽可能简洁。
所以我们得到了如下两个特性:
1.后台运行。不受输入输出和控制终端影响
2.与当前环境隔离。包括未关闭的文件描述符、控制终端、会话、进程组、工作目录和文件创建掩码等等

守护进程创建的流程图

graph TB D[远程会话]-->A A[主进程]-.操作一.->B[子进程] B-.操作二.->B[子进程] B-.操作三.->C[孙进程] C-.操作四.->C

操作一

创建子进程并杀死主进程。子进程变为孤儿进程由Init进程托管

操作二

setsid函数创建新的会话。子进程会成为新的会话组组长。由于会话过程对终端的独占性,新进程组与控制终端脱离。

操作三

创建孙进程并杀死子进程。孙进程才是真正的守护进程。

操作四

关闭打开的文件描述符
进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。

代码

int switchDaemon() {
    //操作1
    pid_t ret = fork();
    if (ret == -1) { return -1; }
    if (ret > 0) { exit(0); }

    //操作2
    ret = setsid();
    if (ret == -1) { return -2; }

    //操作3
    ret = fork();
    if (ret == -1) { return -3; }
    if (ret > 0) { exit(0); }

    //操作4
    umask(0);
    signal(SIGCHLD, SIG_IGN);
}

进程组、进程组组长、前后台进程组、会话之间的关系

graph LR subgraph g1[会话] subgraph g1_1[前台进程组] subgraph g1_1_1[前台进程组组长进程] end subgraph g1_1_2[其他前台进程组进程...] end end subgraph g1_2[后台进程组...] end end

如图所示:

  1. 每个进程组中有多个进程,只有一个进程组组长()
  2. 一个会话中包含许多进程组,只有一个前台进程组

前台进程组该进程组组长和终端相连,该终端是这个会话的控制终端。

一个会话只能有一个控制终端,而一个控制终端只能控制一个会话。用户通过控制终端,可以向该控制终端所控制的会话中的进程发送键盘信号。
同一会话中只能有一个前台进程组,属于前台进程组的进程可从控制终端获得输入,而其他进程均是后台进程,可能分属于不同的后台进程组。

标签:创建,ret,会话,终端,进程,操作,守护,前台
From: https://www.cnblogs.com/tofu-ran/p/17131658.html

相关文章

  • linux014之进程和服务管理
    linux中的进程管理:查看进程命令:ps:查看应用级别的进程ps-e:查看系统+应用级的进程ps-ef:显示进程的全部信息(这个命令经常用)ps......
  • 10. 创建不同类型的工程
    恐惧是本能,行动是信仰(在此感谢尚硅谷宋红康老师的教程)1.创建Java工程在工程上,右键-New-Module,如下:指明Java工程的名称及使用的JDK版本:创建包:......
  • 为什么子进程要继承处理器亲缘性?
    请先考虑一个典型的程序为什么需要启动一个子进程。(当然资源管理器不算一个典型的程序)这是因为手头的任务被分解为子任务,无论出于何种原因,这些子任务都被放入子流程中。......
  • 创建TXT文字
    voidDZWEIZHI::CreaTxt(stringstr,doublenote_origin[3])////创建TXT文字{ try { //----Enteryourcallbackcodehere----- NXOpen::Session*theSession=NXO......
  • 创建拉伸UFUN+nxopen
    voidDZWEIZHI::CreaExtrudeBuilder()//创建拉伸UFUN+nxopen{ try { //----Enteryourcallbackcodehere----- NXOpen::Session*theSession=NXOpen::Session::G......
  • 创建拉伸nxopen方式
    voidDZWEIZHI::CreaExtrude(stringstr,doublenote_origin[3],tag_tObj)//创建拉伸nxopen方式{ try { //----Enteryourcallbackcodehere-----  NXOpen::Se......
  • 进程表自动机 1.0 by xiezheyuan
    安装依赖首先保证您的电脑里有Python3,且Python在环境变量中。运行:Windowspython-mpipinstallrequestspython-mpipinstallbs4NOILinuxpython3-mpip......
  • Vue:使用create-vue快速创建Vue测试项目
    开发过程中,有时候需要测测试一些开源框架,这时候开源使用create-vue来快速创建测试项目:create-vue开源地址:https://github.com/vuejs/create-vue创建Vue2项目npmcreat......
  • Linux 进程名修改
    /*进程名修改*/#include<stdlib.h>#include<string.h>#include<stdio.h>#include<errno.h>/*知识补充:LinuxC中environ变量是一个char**类型,存储着......
  • DHCP源码分析_dhcpd后台进程子模块
    dhcpd是dhcp服务器端后台进程文件,dhcpd后台程序总是读取配置文件/etc/dhcpd.conf。一,守护进程的基本流程    dhcpd基本流程为: main(){/*设置isc和d......