0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Linux爱好者 来源:Linux爱好者 作者:Liao Tonglang 2020-12-07 16:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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爱好者】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97434
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67828

原文标题:Daemon 进程的创建

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何同时在多个进程中使用 IMX-SMW ELE 后端?

    使用同一个密钥。一个例子是使用 HSM 包装密钥作为其私钥的 Web 服务器。 据我们所知,两个不同的进程不能同时使用 imx-smw 库使用同一个密钥,因为每个进程需要打开相同的 (ele) 密钥
    发表于 04-17 09:47

    深入了解Maxim产品命名规则

    深入了解Maxim产品命名规则 电子工程师在进行产品设计时,常常需要与各种不同的电子元件打交道。而熟悉这些元件的命名规则,对于我们准确选择和使用产品至关重要。今天,就让我们一起来详细了解Maxim
    的头像 发表于 04-02 14:55 181次阅读

    飞凌嵌入式ElfBoard-进程进程状态

    状态转换:进程是动态的活动的实例,这就意味着进程的状态之间可以发生转换;进程在其生命周期中会经历不同的状态,这些状态反映了进程当前的执行情况。由于操作系统
    发表于 03-27 09:12

    飞凌嵌入式ElfBoard-进程的相关信息之用户ID和组ID

    需要以合适的用户和组运行。与进程相关的用户ID包括:实际用户ID、有效用户ID、保持设置的用户ID、文件系统用户ID。(组ID相同,不再详细展开描述)1.实际用户ID(RUID)为进程启动时的用户ID
    发表于 03-12 17:13

    飞凌嵌入式ElfBoard-进程的相关信息之父进程和子进程

    进程在创建时,创建进程是新进程的父进程,新进程是创建进程的子
    发表于 03-12 17:12

    飞凌嵌入式ElfBoard-进程之什么是进程

    在Linux系统中,有些基本命令能够查看到进程的信息。例如ps、top、pgrep、pstree等;这些命令为用户提供了查看和管理Linux进程信息的多种功能。通过合理使用这些命令,用户可以监控
    发表于 03-02 08:49

    飞凌嵌入式ElfBoard-进程之什么是进程

    是静态的,不占用系统资源,只有在被执行时才会转换为进程。程序通常有多种表现形式,常见的表现形式如下源代码形式:使用编程语言(如:C语言)写成的一系列语句组成,是人类可以阅读的文本文件;想要执行程序,需要
    发表于 01-26 08:42

    进程概念和特征

    进程的概念   在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process)的概念,以便更好地描述和控制程序的并发执行,实现操作系统
    发表于 01-15 06:39

    进程通信

    访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如 P操作、V操作),对共享空间的写/读进行控制。共享存储又分为两种:低级
    发表于 01-15 06:16

    进程的控制

    是:   1. 在该事件的等待队列中找到相应进程的PCB。   2. 将其从等待队列中移出,并置其状态为就绪状态。   3. 把该PCB插入就绪队列中,等待调度程序调度。   需要注意的是,Block原语
    发表于 01-15 06:05

    解析Linux的进程、线程和协程

    )轻量级:相对于进程,线程的创建和切换开销较小。 (3)同步与通信:线程之间需要通过同步机制(如互斥锁、信号量)来保证数据的一致性。 协程(Coroutine) 协程是一种轻量级的用户态线程,它们
    发表于 12-22 11:00

    【HZ-T536开发板免费体验】—— linux 进程创建

    Linux进程通信方式有这几种: 1。管道 2。信号量 3。消息队列 4。共享内存 在本帖子中,我会讲解fork(),exit()系统调用的实践。通过应用编程来实现系统调用。 1,进程创建 打开
    发表于 09-01 20:49

    请问DTU的设备号都在什么情况下需要填写,填写的规则是什么?

    DTU的设备号都在什么情况下需要填写,填写的规则是什么?
    发表于 08-07 07:50

    KiCad 中的自定义规则(KiCon 演讲)

    设计规则 展开,重点探讨了 那些复杂却强大的特性。 由于这些规则本质上是基于文本表达的,需要用户细致入微的理解。演讲的 核心目标 是引导用户有效实施这些规则,从而 规避布线问题、提升制
    的头像 发表于 06-16 11:17 2557次阅读
    KiCad 中的自定义<b class='flag-5'>规则</b>(KiCon 演讲)

    需要遵循哪些步骤才能在协同处理器模式下配置 FX2/FX3?

    FX2/FX3 替换 CY7C67300。 我们需要遵循哪些步骤才能在协同处理器模式下配置 FX2/FX3? 1。是否需要单独编程 FX2/FX3 才能与我们的主控制器接口? 2。GPIF II 支持并行总线接口吗?
    发表于 05-26 07:58