编写daemon进程需要遵循哪些规则?

daemon 进程生命周期长且在后台运行。编写daemon进程需要遵循哪些规则呢?
1、执行fork()函数,父进程退出,子进程继续
执行这一步,原因有两个:
父进程可能是进程组的组长,从而不能够执行后面要执行的setsid函数。
子进程继承了父进程的进程组id,一定不会是进程组组长,所以子进程一定可以执行setsid。
如果daemon是从终端命令行启动的,那么父进程退出后,shell会显示shell提示符,让子进程在后台执行。
2、子进程执行下面三个步骤
修改当前目录为根目录 如果当前工作路径上包含根文件系统以外的文件系统,那么这个文件系统将不能被卸载。
当然也可以改成其它合适的目录。这里使用函数chdir(/)。
调用setsid 这是为了切断与控制终端的所有关系,创建一个新的会话。
此时无论终端是否发送sigin、sigquit或者sigtstp或者断开,都与daemon进程无关。
使用umask(0)设置文件模式创建掩码为0 这一步的目的是让daemon进程创建文件的权限属性与shell脱离关系。
因为默认情况下,进程的umask来源于父进程shell的umask。如果不执行umask(0),那么父进程的shell就会影响daemon,造成daemon每次执行的umask信息不一致。
3、再次执行fork,父进程退出,子进程继续
执行完前面两步之后,新建了会话,进程是会话的首进程,也是进程组的首进程;进程id,进程组id,会话id相同;进程和终端失去联系。
但是还差一步。daemon进程有可能会打开一个终端设备:
intfd=open(/dev/console,o_rdwr);这个设备是否会成为daemon进程的控制终端,取决于两点:
daemon进程是不是会话的首进程。
系统实现。(bsd的实现不会成为daemon的控制终端,但posix由具体实现决定)。
为了万无一失,需要使用fork()确保daemon不是会话的首进程。
4、关闭stdin,stdout,stderr
关闭之后应该打开/dev/null将0,1,2描述符指向它。这是为了防止后面执行0,1,2上的i/o时出现错误。
c库的daemon函数和这个流程相似,但没有第二次fork。
原文标题:daemon 进程的创建
文章出处:【微信公众号:linux爱好者】欢迎添加关注!文章转载请注明出处。


兆欧表的使用方法及要求
让露营更自由,让电力不中断
夏季LED显示屏的维护保养方法
轻量化高精度北斗人员定位识别卡,性能远超普通北斗人员识别卡
中软国际携手绍兴移动、中移物联网共建首个床垫行业5G+全连接工厂,打造OneCyber生产制造数字化标杆
编写daemon进程需要遵循哪些规则?
美国证交会SEC只给违法哎西欧发传票吗?
使用VisualAudio实时架构开发音频系统
微软公布18个Edge浏览器流氓扩展需删除
电动机常用控制电路原理图分享
如何保护医疗设备中的电缆和连接器免受电磁干扰
努比亚Z17S评测 目前综合体验最佳的全面屏旗舰之一
区块链专利创新正在推动区块链向广泛实施迈进
一位十年嵌入式工程师的经验之谈:会导致难点bug的各种问题
三相感应电机的工作原理和等效电路
如何格式化和分区硬盘驱动器
三维天地SW-LIMS助力实验室疫苗批签发能力提升
VHF发射机各模块电路的工作原理及设计方法
评测拆解:共享充电宝功率虚标、伤电池?
专访国科光芯:激光雷达产业和OPA技术路线有哪些独特的见解?