守护进程(初学者必备)

这篇具有很好参考价值的文章主要介绍了守护进程(初学者必备)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.进程组和会话

二.守护进程的概念

三.守护线程的特点

四.守护进程创建的基本步骤


一.进程组和会话

1.进程组的相关概念:

进程除了有进程的PID之外还有一个进程组,进程组是由一个进程或者多个进程组成。通常他们与同一作业相关联可以收到同一终端的信号

每个进程组有唯一的进程组ID,每个进程组有一个进程组组长。如何判断一个进程是不是这个进程组的组长了,通常进程组ID等于进程ID那么这个进程就是对应进程组的组长。

2.会话的相关概念

会话是有一个或者多个进程组组成的集合

一个会话可以有一个终端,建立与控制终端连接的会话首进程被成为控制进程,一个会话的几个进程组可以分为前台进程和后台进程,而这些进程组的控制终端相同也就是sesion id是一样的当用户使用ctr +c 产生SIGINT信号时内核会发送信号给相应前台进程组的所有进程如果我运行一个程序我们想要把他放到后台运行我们可以在可执行程序的后面加一个& 举个列子:./test & 如果我们想要把他提到前台进程我们可以使用fg

二.守护进程的概念

守护进程也叫做精灵进程,是运行在后台的一种特殊进程他独立于控制终端并且可以周期性的执行某种任务或者等待处理某些发生的事件。

守护进程是非常有用的进程,在Linux当中大多数服务器用的就是守护进程比如Web服务器httpd等,同时守护进程完成很多系统的任务。当Linux系统启动的时候,会启动很多系统服务,这些进程服务是没有终端的也就是说你把终端关闭了这些系统服务是不会停止的,他们一直运行着他们有一个名字就叫做守护进程。

我们可以使用ps ajx来查看系统中的进程

参数说明:

  • a代表不仅列出当前用户的进程并且其他用户的进程也会被列出
  • 参数x表示不仅列出所有控制终端的进程也列出所有无控制终端的进程
  • 参数j表示列出也作业控制相关的进程

下面我们使用ps axj来查看系统中的守护进程

守护进程(初学者必备)

 其中TTY为?号的都表示这个进程和终端没有关系。

三.守护线程的特点

守护进程是一种长期运行的进程,这种进程在后台运行并且不根任何控制终端关联其主要特点如下:

  • 生存周期长[不是必须]:一般是操作系统启动的时候他启动,操作系统关闭的时候他也关闭

  • 守护进程和终端没有关联,也就是说他们没有控制终端,所以你控制终端退出也不会导致守护进程退出

  • 守护进程是在后台运行不会占着终端,终端可以执行其它命令

linux操作系统本来就有很多的守护进程默默运行,维持系统的正常活动大概有30到50个, ps -efj ppid为0的进程为内核进程,跟随系统启动声明周期是随内核的,cmd列带[]的这种叫内核守护进程,老主init也是守护进程负责启动各运行层次特定的系统服务,所以很多进程的ppid是init.并且这个init进程也负责收养孤儿进程,cmd列不带[]我们称为普通守护进程,也叫做用户守护进程。

四.守护进程创建的基本步骤

1.设置权限掩码,调用umask(0)权限掩码不会对文件的权限有太多的影响

2.父进程创建子进程,fork一个子进程(脱离终端)出来然后父进程退出(把终端空出来不让中端卡住):固定套路。其中fork()的目的是想调用setsid()来建立新会话目的是子进程有单独的sid,而且子进程也成为了一个新进程组的组长,同时子进程不关联任何终端。(注意:调用setsid建立新会话的进程不能是进程组的组长)

3.由于守护进程和终端没有关系所以我们需要将子进程的标准输入和标准输出重定向到dev/null(空设备当中去)所以我们可以使用open函数打开这个空设备文件将子进程的标准输入和标准输出重定向到这个空设备对应的文件当中(黑洞确保守护进程不从键盘接收任何东西也把任何东西打印到屏幕上)

下面我们来看看创建守护进程的代码:

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include<sys/stat.h>
#include<cstdlib>
#include<fcntl.h>
//创建守护进程
int ngx_daemon()
{
    int fd;
    switch (fork())//创建子进程
    {
    case -1:
    //创建子进程失败这里可以写日志
        return -1;
    case 0:
       //子进程走到这里直接break即可
        break;
    default:
       exit(0);
       //父进程退出
        break;
    }
    //只有子进程才会走到这里
    if(setsid()==-1)
    {
        //记录错误日志
        return -1;
    }
    umask(0);//设置权限掩码
    fd=open("/dev/null",O_RDWR);//打开黑洞设备以读写方式打开
    if(fd==-1)
    {
         //记录错误日志
         return -1;
    }
    if(dup2(fd,0)==-1)//进行重定向
    {
       //记录错误日志
       return -1;
    }

    if(dup2(fd,1)==-1)
    {
        //记录错误日志
        return -1;
    }
    
    if(fd>3)
    {
        if(close(fd)==-1)
        {
            //记录错误日志
            return -1;
        }
    }
    return 1;
}
int main(int argc, char *argv[])
{
    
    if(ngx_daemon()!=1)
    {
        //创建守护进程失败可以做失败后的处理比如写日志等等
       return 1;
    }
    else
    {
        //创建守护进程成功执行守护进程要干的活
        for(;;)
        {
            sleep(1);
            //打印了也没有用因为子进程已经重定向了,不会打印任何结果到标准输出上
            printf("休息一秒,进程id=%d!\n",getpid());
        }
    }

    return 0;
}

总结:

1.守护进程不会收到的信号SIGHUP:终端断开信号守护进程不会收到内核SIGHUP信号,如果收到了SIGHUP信号那么肯定是另外的进程发送给你的,很多守护进程把这个信号做为通知信号,表示配置文件已经发生改变守护应该重新读入其配置文件,同时也不会收到内核的SIGINT和SIGWINCH信号。

2.守护进程和后台进程的区别:

守护进程和终端没有关系但是后台进程能往终端上输出东西和终端有关联

守护进程关闭终端时不受影响而,后台进程会随着终端的退出而退出文章来源地址https://www.toymoban.com/news/detail-475823.html

到了这里,关于守护进程(初学者必备)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QuantumultX 初学者傻瓜教程

    我这里以“orz”大佬来介绍。 大佬集成了分流、策略、去广告、比价、boxjs等功能,并给了非常详细的任务订阅列表,非常方便。 项目地址:https://github.com/Orz-3/QuantumultX TG频道:https://t.me/Orzmini TG群组:https://t.me/Orz_mini 食用方法:就是把远程配置文件下到本地覆盖再进行设置

    2024年02月08日
    浏览(41)
  • C语言初学者自序

    在这篇博客的开头,我首先说明,本人是金融专业大一的菜鸟。为什么会学习C语言以及与计算机的不解之缘,我会在下面一一解答。 我与计算机的故事,得从我幼年时说起。当然,这不是老太婆裹脚——又臭又长的故事。毕竟我自己也时时回顾这段经历,它有如晨钟暮鼓。

    2023年04月09日
    浏览(35)
  • ChatGPT初学者最佳实践

    2022年11月底,ChatGPT引爆了新一轮AI的革命,也让人们意识到AI真的能够大幅度提高人们的工作效率,甚至有人担心自己的工作会因为AI不保。这种居安思危的意识是正确的,但是正如锛凿斧锯的出现,并没有让木匠这个行业消失,而是让这个行业以更高效的方式工作。所以作为

    2024年02月05日
    浏览(45)
  • linux初学者小命令

    进程 :进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。 bash执行命令的过程,以’ls’命令为例: 第一步. 读取输入信息 :shell通过STDIN(标准输入)的getline()函数得到用户的输入

    2024年02月13日
    浏览(39)
  • 初学者该如何入手云计算

    妥妥的适合零基础入门云计算专业的学习路径,请收好。 我们将云计算的学习划分为4个阶段,基础阶段、初级阶段、应用阶段、进阶阶段。 (1)基础阶段 在基础阶段需要掌握通用的知识,有了扎实的基础后面才能走的更远,比如计算机组成原理、计算机网络、操作系统、

    2024年02月02日
    浏览(93)
  • 算法初学者指南:理解排序算法

            排序是计算机科学中的基本问题之一,也是数据处理的核心步骤。从最简单的个人项目到复杂的工业级应用,排序都扮演着关键角色。本文将介绍四种常见的排序算法:冒泡排序、插入排序、快速排序和堆排序,旨在帮助算法初学者理解这些基本概念。         冒泡

    2024年01月23日
    浏览(49)
  • 大语言模型初学者指南 (2023)

    大语言模型 (LLM) 是深度学习的一个子集,它正在彻底改变自然语言处理领域。它们是功能强大的通用语言模型,可以针对大量数据进行预训练,然后针对特定任务进行微调。这使得LLM能够拥有大量的一般数据。如果一个人想将LLM用于特定目的,他们可以简单地根据各自的目的

    2024年02月11日
    浏览(55)
  • 初学者怎么学习c++(合集)

      学习c++方法1 找一本好的书本教材,辅助看教学视频。好的教材,可以让你更快更好的进入C/C++的世界。在校学生的话,你们的教材通常都是不错的。如果是自学,推荐使用谭浩强出的C/C++经典入门教材。看视频是学习比较直观的方式。建议先看课本,不懂的地方,更看视频

    2024年02月16日
    浏览(56)
  • Advanced Solidity初学者教程

    目录 Advanced Solidity 引言: 1. 数学和算术 2. 时间和时间单位 3. 结构体 4. 修饰器 5. 枚举 6. 继承 7. 抽象合约 8. 接口 9. 库 10. 存储位置 Advanced Solidity(高级Solidity)是一种区块链编程语言Solidity的深入应用,通常用于构建智能合约和去中心化应用(DApps)。它涉及复杂的编程概念

    2024年04月28日
    浏览(48)
  • 初学者关于ConvLSTM的理解

    最近在着手于使用ConvLSTM进行时空序列预测问题,由于本人刚接触深度学习,很多代码都还理不清,故想到自己通过记录来加深对模型的理解,肯定会有很多问题和不专业的地方,若有网友看见,请不吝指教,谢谢。 ConvLSTM是施博士在《Convolutional LSTM Network: A Machine Learning Ap

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包