创建守护进程的深入分析

3.android 开机启动流程分析--init启动中关键进程 uevent & watchdog 目录 本章关键点总结 & 说明: 1Uevent入口 1.1解析和处理uevent的rc文件 1.2 polling uevent消息,对设备进行管理 1.2.1 device_init()实现如下: 1.2.2关注➕handle_device_event 和handle_firmware_event的分析: 1.3 总结{uevent功能} 2watchdog... 阅读详情

原文:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4071026&page=1#pid23806182

创建守护进程的过程有两种:
一、fork两次

int main()
{
if(fork())
   exit(0);
  setsid()
  if(fork())
   exit(0);
  //守护进程代码
}

二、

int main()
{
if(fork())
   exit(0);
  setsid()
  //守护进程代码
}

其实两种方法在某种程度上来说都可以,但是double fork会带来一些区别。
首先,我们得搞清楚这些代码都干了什么:
1、第一次fork,确保当前的process一定不是session leader,关于session,继续往下看
2、setsid,创建新的session,因为session leader调用setsid不会创建新session,所以我们才需要之前的那个fork。
那session到底是什么?当你通过控制台登录时,你就创建了一个session,一个session就是一个controlling terminal、一个controlling process group,再加上一堆后台process group,其中controlling process一般就是login shell,controlling terminal就是你在敲键盘看显示器的那个“终端”。在shell中,你可以用”&”将一个命令在后台运行,或者你可以按Ctrl-Z,然后用bg命令将其放入后台,这时你可以用jobs命令看到后台运行的进程,这些后台进程就是background process group
看看当你logout的时候会发生什么,此时controlling terminal会被关闭,这个session中所有进程都会收到SIGHUP和SIGTERM/SIGQUIT,对于这些信号的缺省操作就是结束进程。
作为一个daemon,你当然不希望用户logout的时候就退出,解决方案有几种,一种就是忽略上述所有信号,例如nohup程序干的就是这个,但这样做有个小问题,很多程序使用信号作为一种简单的IPC机制,忽略这些信号会导致这种IPC失效;另外一种方案就是让进程从这个controlling terminal上脱离,setsid将会创建一个新的session,使当前进程成为新session的leader,并且不再关联之前session的controlling terminal。
3、第二次fork,这件事情有点晦涩,其实很多文档上并没说的太清楚,具体原因是这样的,即使一个进程创建了新的session,它依然有可能获得一个controlling terminal,比如你可以用ioctl(TIOCSCTTY),这样做的后果就是,新的session有了controlling terminal,然后前面我们提到的所有问题依然可能发生。为了彻底解决这个问题,我们需要第二次fork,因为ioctl(TIOCSCTTY)手册中在非常不起眼的地方提到了,只有session leader才能为session打开controlling terminal,第二次fork之后,子进程就是session中第二个进程,它这辈子再没机会成为session leader了(除非它调用setsid),也就再没能力打开controlling terminal了。这样我们就一劳永逸的解决了所有问题。

所以,如果你的程序行为很固定,你知道它不会无聊到去打开controlling terminal的话,第二次fork其实是不必要的,但是如果你是在写一个库,而且不知道使用它的程序到底会有什么样的行为,你最好还是再fork一次。

其实干了所有上述的事,依然还有一些遗留问题,你还需要:
1、chdir(“/”),这样可以防止你的程序工作目录所在的文件系统无法umount的问题
2、close/reopen所有你不需要的fd,尤其是stdin/stdout,因为这些fd是从父进程继承下来的,如果它们是管道,而对端有关闭了,读写它们会产生SIGPIPE
3、设置正确的umask,这也是从父进程继承下来的,不一定是你想要的值
4、设置适当的env,同上
5、设置适当的sigmask
6、如果你的daemon需要创建子进程,你可能还需要signal(SIGCHLD, SIG_IGN),防止退出的子进程成为zombie

Metal 一、初识 Metal 及其语言规范 游戏开发者的新的技术平台,该技术能够为3D图像提高 10 倍的渲染性能。苹果2018年推出 Metal,在此之前一直使用OpenGL ES。1图形渲染;2高并发计算。苹果文档给出的 Metal 优化:CPU 低消耗、GPU 高利用、连续处理器并行、有效的资源利用Metal 官方文档。 阅读详情

相关推荐

微带功分器设计与ADS-EM联合仿真实战解析

本文详细解析了微带功分器设计与ADS-EM联合仿真的实战技巧,涵盖特性阻抗计算、ADS原理图设计、版图生成与EM仿真等关键步骤。通过实际案例分享,帮助工程师掌握射频电路设计中的核心技术和调试方法,提升功分器设计效率与性能。

weixin_29280219的博客 451

通过两次fork避免产生僵尸进程

僵尸进程产生的原因是父进程没有处理子进程的退出信息,导致子进程退出后因zombie结构没有及时释放而变成了僵尸进程,为避免该问题的产生,建议采用fork两次的方案。 进程关系为:爷爷->父亲->孙子。 方案分析:         之所以会产生僵尸进程,是因为在进程后终止,除了回收分配到的内存和资源外,还要保留一部分信息供感兴趣者使用,一般是父进程。但是,如果在子进程退出后,父进程没有处理子进

小顽童的农场 933

DAC8568控制器实战:如何用STM32实现多通道同步输出(附完整代码)

本文详细介绍了如何使用STM32微控制器驱动TI的DAC8568多通道DAC控制器,实现高精度的多通道同步模拟信号输出。内容涵盖硬件设计要点、SPI时序精准配置、驱动层命令构建,并重点解析了通过LDAC引脚实现同步更新的核心策略,提供了完整的代码框架和实战案例,帮助工程师快速解决多通道同步输出的工程难题。

weixin_29179311的博客 171

Daemon进程为何需要两次fork

Daemon进程 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。(来自维基百科) 常见的Apache服务器(httpd),MySQL服务端(mysqld),作业规划进程(crond)都是以守护进程的方

epic2005的专栏 712

毫米波雷达dd-mimo中发射天线辐射方向图变化

本文详细介绍了dd-mimo的相位调制原理,以及分离天线的办法,最后演示了在dd-mimo中因为相位调制带来的辐射方向图的变化。

weixin_44555637的博客 1169

Xilinx Vitis HLS教程1--Vitis HLS概述[01/12]

Xilinx Vitis HLS教程[01/10]前言1. Vitis HLS简介1.1 软件工程师的设计原则1.1.1 简介1.1.2 吞吐量和性能1.2.3 架构问题1.2.4 FPGA编程的3大范式1.2.4.1 生产者-消费者范式1.2.4.2 流式数据范式1.2.4.3 流水线范式1.2.5 3种范式结合 前言 项目中使用到Xilinx Zynq UltraScale+ MPSoC ZCU102 开发板,领导指示研究"xilinx软件自带的c语言综合器"。对于一个硬件一窍不通的我来说,甚至不知道

B10030607的博客 5239

listener为何要fork两次子进程

http://www.itpub.net/thread-1799332-1-1.html 以下是根据网络资料个人总结的listener监听流程(如果有误烦请指正) 大致分为6个阶段 1 客户端向数据库发起连接请求,li...

congdiku5262的博客 145

【git】win 10 / win 11:git 首次拉取云效平台代码详细教程

git 首次拉取云效平台代码详细教程:Git 生成 SSH 公钥、云效工作台添加 SSH 公钥、git 使用 SSH / HTTP 链接拉取云效代码

顾三殇 —— 博客空间(软件测试) 4218

防止僵尸进程的fork编程

直接上代码: ----- gcc fork_test.c -----  #include #include #include #include #include #include void sig_chld(int signo) { pid_t pid; int stat; while ( (pid = waitpid(-1, &stat, WNO

daiyudong2020的博客 1287

【数据集】未来不同情景下预测数据:如人口、土地利用等

未来不同情景下预测数据:如人口、土地利用等

WW、forever的博客 2996

prplOS介绍

介绍prplOS是什么,特性、框架、编译等。

四儿家的小祖宗的博客 2131

linux 会话 进程组,Linux进程模型——会话和进程组

先放总结给没空看全文的人:session(会话)是用户登录系统以后所需的context(上下文)process group(进程组)是一组相关联的进程,用来方便信号量的分发session退出以后所有隶属于该session的进程组都会收到hup信号而挂起,这样就有了控制进程生命周期的作用tty可以作为输入输出设备被绑定到一个session上,bash就是这么干的子进程会继承父进程的session和p...

weixin_30336531的博客 434

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python守护进程 可以创建线程吗,从python守护进程启动线程的正确方法

I need to write simple daemon with web interface.The idea is to use python-daemon package and run wsgiref.simple_server inside one thread.Daemon works fine with the following code :import daemonimport...

weixin_42516040的博客 104

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

10 - 守护进程深度分析

10 - 守护进程深度分析

嵌入式wu 672

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

UDP协议栈内核数据结构与守护进程创建流程分析

本文介绍了UDP协议原理和守护进程相关知识。UDP部分分析了其报头结构(固定8字节)、内核数据结构(无发送缓冲区但有接收缓冲区)及分离分用机制(通过指针类型强转实现)。守护进程部分讲解了进程组、作业与会话的关系,重点阐述了如何通过fork+setsid系统调用创建守护进程,使其脱离终端控制。文章包含内核数据结构图示和命令行操作示例,深入浅出地解释了网络协议和进程管理的核心概念。

2401_87889177的博客 177

Linux C++守护进程实现:从原理到生产环境实践

在Linux系统编程中,守护进程是实现后台服务稳定运行的核心技术。其原理在于通过fork()创建子进程并脱离终端控制,利用setsid()创建新会话,从而与启动环境解耦,实现独立运行。这项技术的核心价值在于保障服务的高可用性与无人值守能力,是构建数据采集、消息队列、微服务等7x24小时运行系统的基石。本文聚焦于C++实现,详细拆解了两次fork、环境清理、信号处理等关键步骤,并深入探讨了PID文件管理、日志记录、资源监控等生产环境中的避坑指南。通过结合systemd集成与多线程信号安全处理等实战经验,为开发

weixin_33908217的博客 399

Podman实战指南:从Docker到无守护进程的容器管理

容器技术是现代应用交付的基础,传统Docker依赖常驻守护进程和root权限,在安全性和运维层面存在天然局限。Podman采用fork/exec架构,无需守护进程,通过用户命名空间实现rootless运行,让普通用户也能安全地管理容器。其镜像格式与Docker完全兼容,可直接拉取、导入导出,配合镜像加速源配置,能显著提升离线环境下的分发效率。Pod支持多个容器共享网络和存储,结合systemd集成,可构建类似Kubernetes的本地编排体验。从开发调试到生产部署,Podman正成为替代Docker的轻量级

weixin_31421613的博客 246

Linux守护进程开发与优化实践指南

守护进程是Linux系统中实现后台服务稳定运行的核心机制,通过脱离终端控制实现长期驻留。其技术原理涉及进程隔离、会话管理和资源控制等操作系统基础概念,在服务器编程中具有重要价值。典型的应用场景包括Web服务、定时任务和系统监控等关键服务。现代Linux系统通过systemd提供了更完善的守护进程管理方案,同时仍需关注进程保活、资源限制和日志管理等工程实践问题。掌握守护进程开发技术对构建高可用Linux服务至关重要,特别是在需要实现服务自动恢复、资源隔离等运维需求的场景下。

weixin_33552698的博客 304

Android 通过JNI实现守护进程,使得Service服务不被杀死

转载出处:http://blog.youkuaiyun.com/yyh352091626/article/details/50542554开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家…虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了…网上搜寻一番后,主要的方法有以下几种方法,但都是治标不治本:1、提高Ser

Luuuuuuo 1万+

Mjpeg-streamer源码分析(一)

Mjpeg-streamer源码分析       -------------------------------------------------------------------------------------------------- 基础知识:  条件变量:   条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:   一个线程等待"条件变量的条件成立

b02330224的专栏 753

open-iscsi源码分析 -- 会话建立

前面可以看出,处理控制中心还是iscsid守护进程,其他进程都是向它发出服务请求,然后它做出响应,而它完成一些操作又是向底层驱动发出指令。在前面的源码中可以发现,重要是一个mgmt_ipc_functions的函数指针数组是一个操作函数集合,其中的函数分别处理不同的服务,服务id就是它在函数指针数组中的索引。 /*不同任务id对应的处理函数地址*/ static mgmt_ipc_fn_t

zhaqiwen的专栏 2530

Android 2.3 SD卡挂载流程浅析(三)

http://blog.youkuaiyun.com/yihongyuelan/article/details/6963485 在前面两篇博文《Android 2.3 SD卡挂载流程浅析(一)》《Android 2.3 SD卡挂载流程浅析(二)》中,主要简单介绍了SD卡的挂载流程以及所涉及的关键文件。在《Android 2.3 SD卡挂载流程浅析(三)》中,将简要介绍Android 2.3中Vo

yada____的专栏 556

Mjpeg-streamer源码分析2

Mjpeg-streamer源码分析       -------------------------------------------------------------------------------------------------- 基础知识:  条件变量:   条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:   一个线程等待"条件变量的条件成立

q472599451的专栏 2232

golang 后台服务设计精要

守护进程传统的后台服务一般作为守护进程(daemon)运行。linux 上创建 daemon 的步骤一般如下:创建子进程,父进程退出;调用系统调用 setsid() 脱离...

Go中国 1611

python processpoolexecutor,为什么并发.futures.ProcessPoolExecutor和multiprocessing.pool.Pool在Python中使用supe...

Why does the following Python code using the concurrent.futures module hang forever?import concurrent.futuresclass A:def f(self):print("called")class B(A):def f(self):executor = concurrent.futures.Pro...

weixin_34271294的博客 289
上一篇: 通过autossh提供内网服务
下一篇: accept与epoll惊群
rainharder
博客等级 码龄22年 31粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值