Linux练级宝典->任务管理和守护进程

news2025/3/14 9:57:50

任务管理

进程组概念

每个进程除了进程ID以外,还有一个进程组,进程组就是一个或多个进程的集合

同一个进程组,代表着他们是共同作业的,可以接收同一个终端的各种信号,进程组也有其唯一的进程组号。还有一个组长进程,组长进程ID == 进程组ID。组长进程可以创建一个进程组,创建进程,然后终止。

attention:进程组只要还有进程就会存在,和组长进程无关,组长会易主。

作业概念

Shell分前后控制的不是进程而是作业(Job)或者叫进程组(Process Group)。

一个前台作业可以由很多进程组成,后台作业同理,Shell可以运行一个前台任务和多个后台任务。这叫作业控制。

作业和进程组的区别:

如果作业中的某个进程又创建了一个子进程,这个子进程不属于作业。一旦作业运行结束,Shell就先把自己拉到前台,如果原来的这个子进程还存在没被终止,此时这个子进程自动变为后台进程组。

会话概念

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

 一个会话有一个控制终端,通常的两种终端情况:1.终端设备(终端登录)2.伪终端设备(网络登录)。建立和控制终端连接的会话首进程称为控制进程。一个会话中有一个前台任务组和多个后台任务组和控制进程。

 下列代码我们生成了5个死循环文件:

#include<stdio.h>

int main(){
    while(1);
    return 0;
}

我们用ps axj指令查看生成的程序。

 上面的[2] 1666625是进程组中的某一个进程的pid。

R表示后台程序 R+表示前台程序

 上图我们使用信号(ctrl + c)把前台进程删除了。1 2 在后台并没有被删除。

 相关操作

前台进程&后台进程

运行某个程序是使用 ./ 的方式,这时的程序在前台运行,如果在后面加上 & 就变成了后台进程。

前台进程状态后面有 + 号,后台进程没有 + 号。

 jobs fg bg指令

jobs指令:可以查看当前会话中有哪些作业

fg(foreground)指令:可以将后台进程提到前台运行,如果该作业在后台运行则直接放到前台运行,如果该作业是停止状态,则会给这个作业的每个进程提到前台运行并发送SIGCONT信号使他们唤醒。

上图可以发现我们的1号任务被取出了,在前台运行。

 如果想将一个前台进程放到后台,可以使用ctrl + z 指令,进程就会变为停止状态。

bg(background)指令:bg指令可以让停止的作业,转而在后台继续进行。本质就是给进程组的每一个进程发送了SIGCONT信号。

 ps指令查看指定选项

ps -o指令,可以查看指定的信息。

-o指令指定只看当前会话的进程。

SESS:session 就是会话的意思,同一会话的进程会话ID相同 

守护进程

守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件

 守护进程的查看

可以用ps axj指令查看系统中的进程

TPGID为-1的进程全部都是没有控制终端的进程,都是守护进程。

COMMAND中用[ ] 括起来的表示内核进程,这些进程在内核中创建,没有用户空间代码,所以这些进程找不到程序文件名和命令行,通常以k为开头表示Kernel内核。

守护进程的创建

守护进程的创建如下:

1.设置文件掩码为0.

2.fork后终止父进程,子进程会创建新会话。

3.忽略SIGCHLD信号。

4.再次fork,终止父进程,保持子进程不是会话首进程,保证了后续不会和其他终端关联。

5.更改工作目录为根目录。

6.将标准输入,标准输出,标准错误都重定向到/dev/null。

说明:

1.文件掩码设置为0,创建出来的文件权限就和我们预期的一样

2.调用setsid创建新会话,让当前进程自成会话,并且此时会与bash脱离关系(创建守护进程的核心)。

3.调用setsid创建新会话时,要求调用进程不能是组长进程,但是我们在命令行上同时启动多个进程协同完成某个任务,其中一个创建好的进程就会成为组长进程,所以我们需要创建子进程,子进程调用后创建新会话后,让父进程退出即可

4.守护进程不能和用户交互,所以就没必要打开某个终端了,打开终端是会话首进程进行的,所以为了防止守护进程有打开终端的操作,所以我们再次fork创建子进程,此时的首进程去执行后续的代码,它不是会话首进程也就没有办法打开终端了(不是必须的操作,但是是一种防御性编程)。

5.一般将守护进程的工作目录放到根目录下,这样就可以使用绝对路径的方式打开文件(不是必须得)。

6.守护进程因为不能和用户交互也就是守护进程和终端没关系了,所以我们把守护进程的fd 0 1 2也就是标准输入输出错误,都放到一个垃圾站里 /dev/null,这是一个字符文件,用于屏蔽丢弃输入输出的信息(不是必须的)。

测试代码如下:

#include <fcntl.h>
#include <signal.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>

int main(){
    //1.设置文件掩码为0
    umask(0);
    //2.fork后终止父进程,子进程创建新会话
    if(fork()>0){
        exit(0);
    }
    setsid();
    //3.忽略SIGCHLD信号
    signal(SIGCHLD,SIG_IGN);
    //4.再次fock,终止父进程,保持子进程不是会话首进程,不会和终端关联
    if(fork()>0){
        exit(0);
    }

    //5.更改工作目录为根目录
    chdir("/");
    //6.将标准输入输出错误重定向到/dev/null中
    close(0);
    int fd = open("/dev/null",O_RDONLY);
    dup2(fd,2);
    dup2(fd,1);
    while(1);
    return 0;
}

结果我们发现该进程的TPGID为-1,TTY显示的为问号,表示这个进程已经与终端失去关联了。

同时PID和PGID不同说明不是会话首进程也不是组长进程,所以不会与其他终端关联。 

我们进程的SID和-bash进程的SID是不同的,说明二者也不是同一个会话了。

通过 ls /proc/进程id -al命令,可以查看这个守护进程的工作目录改为了根目录 

通过 ls /proc/进程id/fd -al命令 可以查看该进程的标准输入输出,重定向的位置

 调用daemon函数创建守护进程

函数原型:

int daemon(int nochdir, int noclose);

参数说明:

nochdir如果为0,则把守护进程的工作目录改为根目录,否则不做处理

noclose如果为0,则将守护进程的标准输入输出错误进行重定向,否则不做处理

测试代码:

注意:有些编译器需要添加 #define _DEFAULT_SOURCE 才能使用

#define _DEFAULT_SOURCE
#include <unistd.h>

int main(){
    daemon(0,0);
    while(1);
    return 0;
}

可以发现这样创建出来和我们自己的没有什么差距,差距就是daemon 依然是组长进程。可能会打开终端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:计算并输出三个整数的最大值 并对三个数排序

这是《C语言程序设计》73页的思考题。下面分享自己的思路和代码 思路&#xff1a; 代码&#xff1a; #include <stdio.h> int main() {int a,b,c,max,min,mid ; //设置大中小的数分别为max&#xff0c;mid&#xff0c;min&#xff0c;abc为输入的三个数printf("ple…

工具(十二):Java导出MySQL数据库表结构信息到excel

一、背景 遇到需求&#xff1a;将指定数据库表设计&#xff0c;统一导出到一个Excel中&#xff0c;存档查看。 如果一个一个弄&#xff0c;很复杂&#xff0c;耗时长。 二、写一个工具导出下 废话少絮&#xff0c;上码&#xff1a; 2.1 pom导入 <dependency><grou…

ACL初级总结

ACL–访问控制列表 1.访问控制 在路由器流量流入或者流出的接口上,匹配流量,然后执行相应动作 permit允许 deny拒绝 2.抓取感兴趣流 3.ACL匹配规则 自上而下逐一匹配,若匹配到了则按照对应规则执行动作,而不再向下继续匹配 思科:ACL列表末尾隐含一条拒绝所有的规则 华为:AC…

调优案例一:堆空间扩容提升吞吐量实战记录

&#x1f4dd; 调优案例一&#xff1a;堆空间扩容提升吞吐量实战记录 &#x1f527; 调优策略&#xff1a;堆空间扩容三部曲 # 原配置&#xff08;30MB堆空间&#xff09; export CATALINA_OPTS"$CATALINA_OPTS -Xms30m -Xmx30m"# 新配置&#xff08;扩容至120MB&am…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷一)

目录 1. 内存和地址 2. 指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量 2.3 解引用操作符 &#xff08;*&#xff09; 3. 指针的解引用 3.1 指针 - 整数 3.2 void* 指针 4. const修饰指针 4.1 const修饰变量 4.2 const修饰指针变量 5…

计算机毕业设计:留守儿童的可视化界面

留守儿童的可视化界面mysql数据库创建语句留守儿童的可视化界面oracle数据库创建语句留守儿童的可视化界面sqlserver数据库创建语句留守儿童的可视化界面springspringMVChibernate框架对象(javaBean,pojo)设计留守儿童的可视化界面springspringMVCmybatis框架对象(javaBean,poj…

golang算法二叉树对称平衡右视图

100. 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a…

Chatbox通过百炼调用DeepSeek

解决方案链接&#xff1a;评测&#xff5c;零门槛&#xff0c;即刻拥有DeepSeek-R1满血版 方案概览 本方案以 DeepSeek-R1 满血版为例进行演示&#xff0c;通过百炼模型服务进行 DeepSeek 开源模型调用&#xff0c;可以根据实际需求选择其他参数规模的 DeepSeek 模型。百炼平台…

【数据结构】6栈

0 章节 3&#xff0e;1到3&#xff0e;3小节。 认知与理解栈结构&#xff1b; 列举栈的操作特点。 理解并列举栈的应用案例。 重点 栈的特点与实现&#xff1b; 难点 栈的灵活实现与应用 作业或思考题 完成学习测试&#xff12;&#xff0c;&#xff1f; 内容达成以下标准(考核…

PyTorch 入门学习

目录 PyTorch 定义 核心作用 应用场景 Pytorch 基本语法 1. 张量的创建 2. 张量的类型转换 3. 张量数值计算 4. 张量运算函数 5. 张量索引操作 6. 张量形状操作 7. 张量拼接操作 8. 自动微分模块 9. 案例-线性回归案例 PyTorch 定义 PyTorch 是一个基于 Python 深…

mov格式视频如何转换mp4?

mov格式视频如何转换mp4&#xff1f;在日常的视频处理中&#xff0c;经常需要将MOV格式的视频转换为MP4格式&#xff0c;以兼容更多的播放设备和平台。下面给大家分享如何将MOV视频转换为MP4&#xff0c;4款视频格式转换工具分享。 一、牛学长转码大师 牛学长转码大师是一款功…

二进制求和(js实现,LeetCode:67)

这道题我的解决思路是先将a和b的长度保持一致以方便后续按位加减 let lena a.length let lenb b.length if (lena ! lenb) {if (lena > lenb) {for (let i 0; i <lena-lenb; i) {b 0 b}} else {for (let i 0; i < lenb-lena; i) {a 0 a}} } 下一步直接进行按…

【C#】使用DeepSeek帮助评估数据库性能问题,C# 使用定时任务,每隔一分钟移除一次表,再重新创建表,和往新创建的表追加5万多条记录

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

【openGauss】物理备份恢复

文章目录 1. gs_backup&#xff08;1&#xff09;备份&#xff08;2&#xff09;恢复&#xff08;3&#xff09;手动恢复的办法 2. gs_basebackup&#xff08;1&#xff09;备份&#xff08;2&#xff09;恢复① 伪造数据目录丢失② 恢复 3. gs_probackup&#xff08;1&#xf…

蓝桥杯备赛-基础练习 day1

1、闰年判断 问题描述 给定一个年份&#xff0c;判断这一年是不是闰年。 当以下情况之一满足时&#xff0c;这一年是闰年:1.年份是4的倍数而不是100的倍数 2&#xff0e;年份是400的倍数。 其他的年份都不是闰年。 输入格式 输入包含一个…

实验四 Python聚类决策树训练与预测 基于神经网络的MNIST手写体识别

一、实验目的 Python聚类决策树训练与预测&#xff1a; 1、掌握决策树的基本原理并理解监督学习的基本思想。 2、掌握Python实现决策树的方法。 基于神经网络的MNIST手写体识别&#xff1a; 1、学习导入和使用Tensorflow。 2、理解学习神经网络的基本原理。 3、学习使用…

【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]

起因 在公共高性能服务器上运行OllamaDeepSeek&#xff0c;如果按照默认配置启动Ollama程序&#xff0c;则自己在远程无法连接你启动的Ollama服务。 如果修改配置&#xff0c;则会遇到你的Ollama被他人完全控制的安全风险。 不过&#xff0c;我们可以使用一个方向代理&#…

Spring boot3-WebClient远程调用非阻塞、响应式HTTP客户端

来吧&#xff0c;会用就行具体理论不讨论 1、首先pom.xml引入webflux依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 别问为什么因为是响应式....…

18 | 实现简洁架构的 Handler 层

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…

coding ability 展开第三幕(滑动指针——基础篇)超详细!!!!

文章目录 前言滑动窗口长度最小的子数组思路 无重复字符的最长子串思路 最大连续1的个数思路 将x减到0的最小操作数思路 总结 前言 前面我们已经把双指针的一些习题练习的差不多啦 今天我们来学习新的算法知识——滑动窗口 让我们一起来探索滑动窗口的魅力吧 滑动窗口 滑动窗口…