【Linux】初始进程

news2024/11/17 9:53:44

目录

基本概念

PCB 

task_struct

task_struct内容分类

组织进程

查看进程

查看正在运行的进程信息

获取pid和ppid

创建子进程


基本概念

        一个已经加载到内存中的程序,叫做进程,正在运行的程序,叫做进程,进程是担当分配系统资源(CPU时间、内存)的实体。

        一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程,因此操作系统必须将进程管理起来,如何管理进程呢?先描述,再组织

        任何一个进程,在加载到内存的时候,形成真正的进程时,要先创建描述进程(属性)的结构体对象--PCB(进程控制块)。

需要注意的是,PCB不等于进程,PCB只是操作系统用来描述进程的所有属性值。

进程 = 内核PCB数据结构对象+代码和数据

PCB 

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

task_struct

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

task_struct内容分类

  • 标识符:描述本进程的唯一标识符,用来区别其他进程
  • 状态:任务状态,退出代码,退出信号等
  • 优先级:相对于其他进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的地址
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据:进程执行时处理器的寄存器中的数据
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
  • 记账信息:可能包括处理器的时间总和,使用的时钟数总和,记帐号等
  • 其他信息

组织进程

所有运行在系统里的进程都以task_struct链表的形式存在内核里

查看进程

进程的信息可以通过 /proc系统文件夹查看

查看正在运行的进程信息

查看进程信息除了上述通过/proc方法,还可以通过ps命令查看正在运行的进程信息

ps的本质就是遍历这个task_struct链表,格式化输出进程信息 。

获取pid和ppid

当进程想获取自己的PID,必须通过系统调用接口 getpid(),返回值是pid_t(也就是一个无符号整数)。

#include <sys/types.h>

#include <unistd.h>

//获取自己的pid

pid_t getpid(void);

//获取父进程的pid

pid_t getppid(void);

创建子进程

 #include <unistd.h>

pid_t fork(void);

  • 如果创建成功了,给父进程返回子进程的pid,给子进程返回0;
  • 如果创建失败了,给父进程返回-1。

可以通过如下代码进行理解:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    pid_t id=fork();
    if(id==0)
    {
        //子进程
    }
    else if(id>0)
    {
        //父进程
    }
    else{
        //error
    }
    return 0;
}

fork之后通常需要使用if进行分流

1、为什么fork要给子进程返回0,给父进程返回子进程pid?

返回不同的返回值,是为了区分,让不同的执行流,执行不同的代码块。一般而言,fork之后的代码父子进程共享。

给子进程返回0,是为了区分子进程跟父进程。

给父进程返回子进程是为了区分不同的子进程,方便后续的对子进程控制。

2、一个函数是如何做到返回两次的?如何理解的?

fork也是一个函数,先创建子进程,在该函数内部return前,子进程已经被创建好了,因此子进程返回一次,父进程也返回一次。

3、id接收fork的返回值,怎么会有不同的内容?

父子进程代码共享,数据各自开辟空间,私有一份(写时拷贝)

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

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

相关文章

如果你不愿意冒一切风险,就不要成为创业者:如何建立一个年收入 1800 万美元的支付业务

作者&#xff1a;Austin Mac Nab&#xff0c;VizyPay 的 CEO 兼创始人 在创业初期&#xff0c;如果有人告诉我&#xff0c;我需要冒一切风险才能成功&#xff0c;我大概会吓得绕道而行。但事实是&#xff0c;如果你不愿意冒一切风险&#xff0c;就不要成为创业者。本着这个信念…

「JavaScript深入」彻底搞懂JS原型与原型链

JavaScript深入 — 原型与原型链 一、原因二、使用class实现继承普通的类实现继承 三、原型四、原型链小结原型原型链prototype和proto 引申 一、原因 JavaScript中除了基础类型外的数据类型&#xff0c;都是对象&#xff08;引用类型&#xff09;。但是由于其没有类&#xff…

央行放大招!潘行长发话了,现在能“贷款炒股“,这是真的吗?

9月&#xff0c;央行掌门人潘行长最新放话了&#xff0c;二套房贷款利率也得下调。这降准的利好一出&#xff0c;股市小涨了一波后又回到了原位&#xff0c;给全球金融市场带来了一股不同寻常的暖流。而非常有意思的是&#xff0c;在这次众多的金融政策大礼包当中&#xff0c;有…

CentOS8.5.2111(3)实验之DHCP服务器架设

一、实验目标 1&#xff0e;掌握DHCP服务器的主配置文件各项申明参数及操作及其含义 2. 具备DHCP 服务器、中继服务器的配置能力 3. 具备测试客户端正常获取服务器分配地址的能力 4. 具备DHCP服务器故障排除能力 二、实训原理/流程 &#xff08;一&#xff09;项目背景 …

媒界:助力民生保障 长城“消防炮”即将批量交付硬核守护万家灯火

一大波“消防炮”即将列装&#xff01; 日前&#xff0c;长城炮官方账号发布一条“‘消防炮’来了”的视频&#xff0c;引发广泛关注。视频显示一批长城炮车型已完成消防装备加装&#xff0c;华丽变身“消防炮”&#xff0c;整装待发&#xff0c;即将交付全国消防&#xff0c;…

创建型模式-简单工厂-工厂方法-抽象工厂

简单工厂模式 例题 uml 代码 package simpleFactory; import java.lang.management.OperatingSystemMXBean; import java.util.Scanner; //定义Person class Person{ public void say(){} } class Man extends Person{ public void say() { System.out.…

Transformer是不是BERT、GPT的妈?看完就知道了

Transformer变异衍生出来了两个超强悍的预训练模型 一、Transformer模型 Transformer是近年来深度学习领域中备受瞩目的模型之一&#xff0c;其核心思想是通过自注意力机制和位置编码来捕捉输入序列中的长距离依赖关系。 自注意力机制让模型在处理每个输入元素时能够关注到所有…

Mac电脑上最简单安装Python的方式

背景 最近换了一台新的 MacBook Air 电脑&#xff0c;所有的开发软件都没有了&#xff0c;需要重新配环境&#xff0c;而我现在最常用的开发程序就是Python。这篇文章记录一下我新Mac电脑安装Python的全过程&#xff0c;也给大家一些思路上的提醒。 以下是我新电脑的配置&…

Java入门2——基本数据类型详解

今天我们系统学习一下Java的八种基本数据类型&#xff0c;和C语言有些还是不太一样的&#xff0c;还是要打起精神&#xff0c;好好学习~ 一、Java的数据类型 首先我们画个图&#xff0c;了解一下Java的数据类型 以上就涵盖了Java的数据类型&#xff0c;那么下面&#xff0c;我…

C语言自定义类型:联合体

目录 前言一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的⼀个练习 总结 前言 前面我讲到C语言中的自定义结构——结构体&#xff0c;其实C语言中的自定义结构不只有结构体&#xff0c;还有枚举和联合体&am…

交通 | 上门配送or自提点配送?最后一公里配送中的需求引导问题

编者按&#xff1a; 为提高最后一公里配送的效率&#xff0c;本文将客户激励与不确定的路线决策相结合&#xff0c;建立了一个两阶段随即规划问题&#xff0c;并开发了一种精确式的分支定界算法进行求解。 摘要&#xff1a; 为了提高最后一公里配送的效率&#xff0c;零售商…

Vue 3 文件编译流程详解与 Babel 的使用

文章目录 一、背景二、结论三、vitejs/plugin-vue 插件调试前物料准备vuePlugin 入口buildStart 方法transform 方法 四、vue/compiler-sfc 核心包parse 方法compileScript、rewriteDefault 方法compileTemplate 方法 五、整体架构六、总结参考资料 一、背景 最近正在研究 rea…

企业防泄密妙招有哪些?请记住这8招!超实用,学起来!

在古代&#xff0c;有云&#xff1a;“密者&#xff0c;德之高也&#xff1b;事以密成&#xff0c;语以泄败。” 这些谚语不仅是对忠诚守密的高度赞扬&#xff0c;更是对保密工作重要性的深刻阐述。 在现代企业中&#xff0c;数据泄露已成为不容忽视的严峻挑战。 如何有效防止…

MFC单按钮启停实例

单击按钮启动、停止交替切欣换 1、在1Dlg.h文件中添加代码 public:CMy1Dlg(CWnd* pParent NULL); // standard constructorBOOL m_b;2、在1Dlg.cpp文件中添加代码 CMy1Dlg::CMy1Dlg(CWnd* pParent /*NULL*/): CDialog(CMy1Dlg::IDD, pParent) { m_hIcon AfxGetApp()->Lo…

高中还来得及选择信息学奥赛赛道吗?

随着信息学奥赛&#xff08;NOI&#xff09;在升学中的重要性日益凸显&#xff0c;越来越多的学生和家长将其视为进入顶尖高校的一个重要途径。然而&#xff0c;很多学生可能直到高中阶段才意识到信息学奥赛的重要性&#xff0c;或者才开始对编程产生兴趣。于是问题出现了&…

DarkLabel2.4版本导入MOT17数据集

目录 背景导入效果MOT17数据集说明DarkLabel导入视频导入gt文件 背景 做目标追踪&#xff0c;目前找了一圈开源工具&#xff0c;发现DarkLabel还是很好用的&#xff0c;提供自动目标跟踪&#xff0c;标注很方便。 由于目标追踪我用的是bytetrack&#xff0c;官网是用mot17数据…

学校周赛(2)

A.Minimize! 题目 思路 本题只需要遍历c的取值&#xff0c;实时更新答案即可 代码 #include<iostream> #include<algorithm> using namespace std;void todo(){int a,b;cin>>a>>b;int ansINT_MAX;for(int ca;c<b;c){ansmin(ans,(c-a)(b-c));}co…

二叉树的前序遍历,中序遍历,后序遍历以及层次遍历(递归方式+C语言代码)

#include<stdlib.h> #include<stdio.h> #include<assert.h> //定义一个二叉树结点结构体 typedef int ElemTpye; typedef struct TreeNode {ElemTpye data;struct TreeNode* left;struct TreeNode* right; }TreeNode; //创建结点 TreeNode* createTreenode(E…

【qt】QQ仿真项目1

一览全局: QQ仿真项目 一.创建项目添加资源文件二.创建数据库三.自定义标题栏Qt类四.加载样式表标题栏按钮的搭配五.标题栏实现移动窗体六.标题栏按钮连接信号槽七.标题栏双击最大化和还原八.基类窗口实现标题栏按钮信号九.重写基类窗口绘图事件确保设置样式表生效十.用户登录界…

Spring Gateway学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…