当前位置: 首页 > news >正文

IO进、线程——守护进程

守护进程

守护进程的创建过程

1、创建子进程,并退出父进程:

守护进程的创建通常通过fork()系统调用实现。fork()会创建一个新的子进程,该子进程是调用进程(父进程)的副本。父进程会继续执行fork()之后的代码,而子进程将继续执行从fork()调用处开始的代码。为了让守护进程在后台运行,父进程需要退出,确保不会成为僵尸进程。子进程将继续执行后续的守护进程代码。

2、创建新会话:

pid_t setsid(void);

在第一步创建的子进程中,调用setsid()系统调用可以创建一个新的会话。这一步是为了让守护进程独立于原始的终端会话,并且脱离控制终端。新会话的创建使得守护进程不会因为终端关闭而受到影响,并且它也不再拥有控制终端。同时,它成为新的进程组的组长,并且没有控制终端可以控制它。

3、更改工作目录:

int chdir(const char *path);

默认情况下,守护进程的当前工作目录可能是在创建它的父进程所在的目录。为了防止影响其他目录的操作,守护进程应该将当前工作目录切换到一个合适的目录。通常,守护进程会切换到根目录/,或者指定一个特定的工作目录。

4、重设文件掩码:

mode_t umask(mode_t mask);

文件掩码是用来限制新建文件的权限的。它决定了在使用open()或者creat()等函数创建新文件时,文件的默认权限。为了确保守护进程创建的文件不受继承的文件掩码影响,需要调用umask()函数进行重设。通常将文件掩码设置为0,以便允许守护进程创建具有完全权限的文件。

5、关闭从父进程继承过来的所有文件描述符:

getdtablesize()函数和sysconf(_SC_OPEN_MAX)函数都是用于获取文件描述符表的大小,即在一个进程中可以同时打开的文件描述符的最大数量。_SC_OPEN_MAX参数表示最大文件描述符数目。现在系统一般都用sysconf(_SC_OPEN_MAX)函数

//循环closeint maxfd = sysconf(_SC_OPEN_MAX);for(int i = 0; i < maxfd ; i++){close(i);}

在创建子进程时,子进程会继承父进程的所有打开的文件描述符。由于守护进程不需要与控制终端交互,而且也不需要继承任何打开的文件描述符,所以应该将所有不必要的文件描述符关闭。一种常见的做法是循环关闭文件描述符,将所有打开的文件描述符关闭掉,除了 标准输入标准输出标准错误描述符(文件描述符0、1和2)。

http://www.lryc.cn/news/98951.html

相关文章:

  • 通过v-for生成的input无法连续输入
  • Ventoy 使用教程图文详细版
  • 脚手架 --- command框架<一>
  • SpringBoot整合Zookeeper
  • Java和C#选哪个?
  • 首批!棱镜七彩通过汽车云-汽车软件研发效能成熟度模型能力评估
  • 【Docker】容器的数据卷
  • CentOS7安装jenkins
  • Hadoop的伪分布式安装方法
  • iOS 应用上架的步骤和工具简介
  • 【信号去噪】基于马氏距离和EDF统计(IEE-TSP)的基于小波的多元信号去噪方法研究(Matlab代码实现)
  • 智驾SOC shell编程应用实战笔记
  • C#实现计算题验证码
  • 【lesson6】Linux下:第一个小程序,进度条代码
  • PostgreSQL实战-pg13主从复制切换测试
  • 如何使用OpenCV库进行图像检测
  • Mybatis中where 1=1 浅析
  • element中el-input组件限制输入条件(数字、特殊字符)
  • 会议OA项目之会议发布(一)
  • 【Android】对象为null的一个原因:在方法内部,重新创建了一个新的对象并将其赋值给原对象,但这并不会改变原始的原对象的引用
  • macbook 软件iMovie for Mac(专业视频剪辑工具)中文版
  • web APIs-练习一
  • AX88179A千兆网卡芯片,支持switch联网
  • Pytorch个人学习记录总结 05
  • windows部署安装redis安装教程
  • Jmeter post请求传参问题
  • 对Windows应用程序进行代码签名
  • 2022 China Open Source Report
  • postgresql|数据库|启动数据库时报错:FATAL: could not map anonymous shared memory的解决
  • 数字签名与数字证书