Linux中的进程、fork、进程状态、环境变量

news2024/11/26 16:55:28

1、进程

1.1 PCB

        进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

1.2 task_ struct内容分类

        标示符: 描述本进程的唯一标示符,用来区别其他进程。

        状态: 任务状态,退出代码,退出信号等。

        优先级: 相对于其他进程的优先级。

        程序计数器: 程序中即将被执行的下一条指令的地址。

        内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

        上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

        I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

        记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

        其他信息

1.3 查看进程

        linux操作系统中的进程信息可以在目录/proc/下查看,大多数进程信息同样可以使用top和ps这些用户级工具来获取

1.4 通过系统调用获取进程标示符

        进程id(PID)

        父进程id(PPID)

 1.5 通过系统调用创建进程-fork

 

 2、进程状态

        为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。

        R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
        S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。

        D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

        T停止状态(stopped):  可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

        X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

2.1 进程状态查看

ps aux / ps axj 命令

2.2 Z(zombie)-僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。

所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态来一个创建僵死进程例子:

#include <iostream>
#include <unistd.h>
using namespace std;

int main() {


     size_t id  = fork();
     int tag = 5;
     if (id) {
         //父进程
        while (1) {
            cout << "I am father!" << endl;
            sleep(1);
        }
    }
     else {
         //子进程
        while (tag){
            cout << "I am child! " << tag--  << endl;
             sleep(1);

         }
    }
    return 0;
}

僵尸进程危害

        进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态

        维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护

        那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!就会造成内存泄露!

2.3 孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

父进程先退出,子进程就称之为“孤儿进程”

孤儿进程被1号init进程领养,当然要有init进程回收。

#include <iostream>
  3 #include <unistd.h>
  4 
  5 using namespace std;
  6 
  7 int main() {
  8 
  9     size_t id = fork();
 10     int tag = 5;
 11     if (id) {
 12         //父进程
 13         while (tag) {
 14             cout << "I am father!  " << tag-- << endl;
 15             sleep(1);
 16         }
 17     }
 18     else {
 19         //子进程
 20         while (1) {
 21             cout << "I am child !" << endl;
 22             sleep(1);
 23         }
 24     }
 25                                                                                                                                         
 26 
 27     return 0;
 28 
 29 }

3、环境变量

        环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

3.1 常见环境变量

        PATH : 指定命令的搜索路径

        HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

        SHELL : 当前Shell,它的值通常是/bin/bash。

查看环境变量的方法:

echo $NAME

比如:

echo $PATH

3.2  和环境变量相关的命令

        1. echo: 显示某个环境变量值

        2. export: 设置一个新的环境变量

        3. env: 显示所有环境变量

        4. unset: 清除环境变量

        5. set: 显示本地定义的shell变量和环境变量

3.3 通过代码来获取环境变量

命令行第三个参数

#include <iostream>

using namespace std;

int main(int argc, char* args[], char* env[]){
   for (int i = 0; env[i]; i++) {                                                                                                    
        cout << env[i] << endl;
   }
   return 0;
}

3.4  环境变量通常是具有全局属性的

#include <stdio.h> 
#include <stdlib.h>
int main() 
{
    char * env = getenv("MYENV"); 
    if(env){
        printf("%s\n", env); 
    }
    return 0; 
}

直接查看,发现没有结果,说明该环境变量根本不存在

导出环境变量

export MYENV="hello world"

再次运行程序,发现结果有了!说明:环境变量是可以被子进程继承下去的!

这个程序的进程是继承bash进程的

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

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

相关文章

锁的升级(Synchonized重量级转换):无锁--》偏向锁--》轻量级锁--》重量级锁

目录 线程的状态转换中锁的升级过程 三种锁的优缺点 无锁--》偏向锁--》轻量级锁--》重量级锁 这三个说的是Synchonized重量级转换 没有竞争偏向锁&#xff0c;轻微竞争轻量级锁&#xff0c;重度竞争重量级锁 线程的状态转换中锁的升级过程 就绪队列随时可能被…

递归学习(转载)

转载至 https://www.cnblogs.com/king-lps/p/10748535.html 为避免原文丢失&#xff0c;因此原文转载作者【三年一梦】的帖子 前言 相信不少同学和我一样&#xff0c;在刚学完数据结构后开始刷算法题时&#xff0c;遇到递归的问题总是很头疼&#xff0c;而一看解答&#xff0c…

大数据平台三大优势详解-行云管家

大数据平台三大优势详解 1、轻松进行数据共享 企业在管理以及快速发展过程中&#xff0c;有着越来越多的数据需要进行管理&#xff0c;如果单独管理则工作量巨大&#xff0c;且难免出现问题&#xff0c;同时共享难。因此需要大数据平台对数据进行统一管理&#xff0c;以及轻松…

Tag 标签 多标签生成、多标签不贴着

Tag 标签 多标签生成、多标签不贴着 多个标签 <el-table-column label"标签" align"center"><template slot-scope"scope"><el-tag type"success" //类型v-for"bsNoteLable in scope.row.bsNoteLables" //…

ar地铁运行原理三维仿真展示提高学员学习效果

轨道交通列车AR可视化教学是AR开发公司利用AR增强现实技术在轨道交通列车旁进行教学的方法。它通过将虚拟信息叠加到现实世界中&#xff0c;使学生能够更直观地理解和掌握相关知识。 轨道交通列车AR可视化教学是一种基于增强现实技术的教育工具&#xff0c;通过将虚拟模型与实际…

Python金币小游戏

游戏规则&#xff1a;移动挡板接住金币 游戏截图&#xff1a; 详细代码如下&#xff1a; import pygame.freetype import sys import randompygame.init() screen pygame.display.set_mode((600, 400)) pygame.display.set_caption(game) p 0 i1 0 s 0 t 0 f1 pygame.f…

​八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.

​八路参考文献&#xff1a;&#xff3b;八一新书&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑出版传媒&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&#xff0e;

Matlab(画图初阶)

目录 1.plot()函数 2. hold(添加新绘图是否保留旧绘图) 3. Plot Style 3.1 线型 3.2 标记 3.3 颜色 ​编辑 4. legend() 5.X 、Y and Title&#xff1f; 6. Text()和annotation() 7.line(创建基本线条) 7.1 基本语法 7.2 指定线条属性 7.3 更改线条属性 8.图像属性 8.1 …

php - fpm 请求达到max_children最大值后,新进入的请求工作流程

前言 偶然之间想了解下&#xff0c;php-fpm 请求达到max_children最大值后&#xff0c;新进入的请求怎么办&#xff1f;是抛出502还是等待前面的请求完成后&#xff0c;再将请求交给处理完毕的进程处理呢。 准备工作 运行环境&#xff1a;LNMP php 版本&#xff1a;php8.1 …

创新指南|CEO如何应对生成式AI带来的4大颠覆创新机遇

生成式AI是一种快速发展的颠覆式创新&#xff0c;可以帮助企业创新商业模式、提高效率和解锁商业价值。本研究介绍如何应对生成式AI技术带来的挑战和机遇&#xff0c;以及如何先发利用这种技术来超越竞争和组织创造力和效率。如果您想了解更多关于生成式AI的企业创新战略&#…

Debian 30 周年,生日快乐!

导读近日是 Debian 日&#xff0c;也是由伊恩-默多克&#xff08;Ian Murdock&#xff09;创立的 Debian GNU/Linux 通用操作系统和社区支持的 Debian 项目 30 周年纪念日。 不管你信不信&#xff0c;从已故的伊恩-默多克于 1993 年 8 月 16 日宣布成立 Debian 项目&#xff0c…

若依 vue中el-radio无法默认选中

网上看了很多方法都不管用, 即便是element官方示例方法也不行 解决方法: html <el-form-item label"是否公开" prop"isOpen"><el-radio-group v-model"form.isOpen"><el-radio :label"0">不公开</el-radio>…

不负众望!历时4年修炼,这本册子终于成书了!

承载着作者的厚望&#xff0c;掘金爆火小册同名读物《Spring Boot源码解读与原理剖析》正式出书&#xff01; 本书前身是掘金社区销量TOP的小册——《Spring Boot源码解读与原理剖析》&#xff0c;整个社区中有3600开发者都不约而同地选择了这本小册&#xff0c;也使它成为掘金…

深度学习入门(Python)学习笔记1

第1章 Python入门 1.1python是什么 Python是一个简单、易读、易记的编程语言&#xff0c;而且是开源的&#xff0c;可以免费地自由使用。 使用Python不仅可以写出可读性高的代码&#xff0c;还可以写出性能高&#xff08;处理速度快&#xff09;的代码。 再者&#xff0c;在…

司徒理财:8.30黄金原油今日最新行情分析及操作策略

黄金走势分析      从日线形态来看&#xff0c;昨晚经历了快速拉升&#xff0c;价格成功稳定在关键的1924压力位之上&#xff0c;最高甚至触及了1938的高点。这表明市场开启了新一轮走势的空间。在当天的日内交易中&#xff0c;我们应特别关注1925一线作为支撑&#xff0c;…

说说多态,多态有几种类型,怎么实现

多态有两种主要的类型&#xff1a; 静态多态&#xff08;编译时多态&#xff09;和动态多态&#xff08;运行时多态&#xff09;。 1、静态多态&#xff08;编译时多态&#xff09;&#xff1a; 静态多态是指在编译时就确定了对象的类型、方法的调用以及绑定。常见的实现方式是…

RESTful API 面试必问

RESTful API是一种基于 HTTP 协议的 API 设计风格&#xff0c;它提供了一组规范和约束&#xff0c;使得客户端&#xff08;如 Web 应用程序、移动应用等&#xff09;和服务端之间的通信更加清晰、简洁和易于理解。 RESTful API 的设计原则 使用 HTTP 协议&#xff1a;RESTful …

函数和方法回顾、cbv源码分析、APIView执行流程分析、序列化组件介绍、序列化组件快速使用之序列化、常用字段类和参数、序列化组件之校验、字典推导式回顾

一 函数和方法回顾 函数和方法-函数:使用def关键字定义的函数,有几个参数&#xff0c;就要传几个参数&#xff0c;不能多&#xff0c;不能少-----》按位置传&#xff0c;按关键字传-方法&#xff1a;定义在类内部&#xff0c;可以自动传值的函数称之为方法---》绑定给对象的方…

RTPEngine 通过 HTTP 获取指标的方式

文章目录 1.背景介绍2.RTPEngine 支持的 HTTP 请求3.通过 HTTP 请求获取指标的方法3.1 脚本配置3.2 请求方式 1.背景介绍 RTPEngine 是常用的媒体代理服务器&#xff0c;通常被集成到 SIP 代理注册服务器中实现媒体传输的功能以减小 SIP 代理服务器的压力&#xff0c;其架构如…

ChatGPT 一条命令总结Mysql所有知识点

想学习Mysql的同学,可以使用ChatGPT直接总结mysql所有的内容与知识点大纲 输入 总结Mysql数据库所有内容大纲与大纲细分内容 ChatGPT不光生成内容,并且直接完成了思维导图。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Offi…