创建守护进程的深入分析

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

STM32 无线充电接收端硬件设计:从 LC 谐振到 PWM 控制的 5 大关键电路解析 本文深入解析了基于STM32的无线充电接收端硬件设计,重点探讨了LC谐振倍压整流、INA282电流采样、IR2104S半桥驱动、超级电容保护及STM32最小系统等5大关键电路。针对超级电容的恒功率充电需求,详细介绍了PID控制算法优化及PCB设计实战要点,帮助工程师提升无线充电系统的效率和可靠性。 阅读详情

相关推荐

告别LM2596!用LM5175打造400W自动升降压数控电源(附完整电路图与代码)

本文详细介绍了如何利用LM5175芯片设计400W自动升降压数控电源,替代传统的LM2596方案。通过四开关Buck-Boost拓扑结构,LM5175实现了高达98%的转换效率和400W大功率输出,支持无缝升降压切换。文章涵盖芯片选型、电路设计、PCB布局及STM32数控实现,为工程师提供完整的实践指南。

weixin_27032989的博客 599

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

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

小顽童的农场 933

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

Daemon进程为何需要两次fork

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

epic2005的专栏 712

树莓派4B保姆级教程:从零配置Python虚拟环境到PySide2开发全流程(含避坑指南)

本文提供树莓派4B上配置Python虚拟环境及PySide2 GUI开发的完整教程。针对armv7l架构的特殊性,详细讲解了从系统准备、虚拟环境创建到PySide2安装的避坑指南,并重点解决了跨平台UI文件处理等常见难题,帮助开发者构建稳定高效的开发环境。

9q8w7e6r5的博客 823

Matlab PolySpace 静态分析实战:从零搭建嵌入式代码安全防线

本文详细介绍了如何使用Matlab PolySpace进行嵌入式代码静态分析,从环境搭建到实战配置,帮助开发者提前发现内存溢出、未初始化变量等潜在缺陷。通过案例分享和进阶技巧,展示如何提升代码安全性和可靠性,特别适合汽车ECU、医疗设备等安全关键系统开发。

weixin_33701617的博客 602

listener为何要fork两次子进程

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

congdiku5262的博客 145

学Simulink--基于多物理场耦合与系统集成的储能系统场景实例:压缩空气储能(CAES)系统的热力学建模与效率分析

本文提供了一个基于Simulink的压缩空气储能(CAES)系统热力学建模教程。通过多物理场耦合方法,详细演示了从系统架构设计到仿真测试的全过程,包括多级压缩机/膨胀机系统搭建、显热蓄热系统设计以及效率分析。文章重点强调了热管理对提升CAES效率的关键作用,并给出了68%电-电效率的优化案例。最后提出了变工况建模、不同蓄热介质对比等高级优化方向,为开发零碳大容量储能系统提供了实用工具和方法。

amy_mhd的博客 131

防止僵尸进程的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

自适应控制 (Adaptive Control) 算法详解及案例分析

自适应控制是一种能够在线调整控制器参数以适应系统动态变化的控制方法。其核心思想是通过实时估计系统参数或调整控制器参数,使系统在不确定性或动态变化的环境中仍能保持稳定性和性能。

闲人编程的博客 4085

麻辣香锅病毒分析

Spicy Hot Pot浏览器劫持病毒(麻辣香锅病毒)从2020年初被安全公司监测到,因其病毒模块带有MLXG_KM被安全行业代称麻辣香锅病毒。目前通过各种激活工具传播, 包括暴风激活、小马激活和KMS激活等诸多工具,疑似与下载站进行合作推广此类激活工具。Spicy Hot Pot 是一个浏览器劫持 Rootkit,它会将用户的主页更改为指向恶意软件操作员控制的页面,此外还会将内存转储从机器上传到预定义的服务器,并结合本地更新功能以确保其保持更新。通常浏览器劫持者会通过更改用户主页的恶意可执行文件或注册表

不忘初心,护天下安全! 4791

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

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

weixin_30336531的博客 434

华为OD机考双机位C卷 - 文件存储系统的排序(Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 文件存储系统的排序, 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 781

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

10 - 守护进程深度分析

10 - 守护进程深度分析

嵌入式wu 672

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

2401_87889177的博客 177

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

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

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、付费专栏及课程。

余额充值