Linux—深入理解进程的概念,PCB,父子进程及查看进程信息的两种方法

进程的概念

课本概念:程序的一个执行实例,正在执行的程序等。

内核观点:担当分配系统资源(CPU,内存)的实体。

 1.描述进程-PCB

我们知道程序是代码编译好后形成的可执行文件,存放在磁盘上。而我们通过学习冯诺依曼体系结构后知道,要想运行程序,需要先把磁盘上的程序加载(将程序拷贝到内存中)到内存上,那么这就是进程了吗?

这里在程序加载到内存之前,就有一个软件运行起来了,这个软件就是操作系统。实际上将程序加载到内存里就是操作系统完成的。往往我们会运行多个程序,将多个程序加载到内存中(这里我们暂且将其叫做"进程"),而操作系统是管理软硬件,进行资源分配的,因此操作系统就需要将它们管理起来,对于操作系统对事物的管理:先描述,再组织!!!  

那么操作系统又是如何描述,组织"进程"的呢?

我们知道操作系统是用C语言写的,因此操作系统会为每一个"进程"定义一个struct结构体,用来描述每一个"进程",而struc结构体里面的内容包含了"进程"的各种属性,同时为了更加方便管理多个进程,这里选择链表进行组织,在struct结构体里加了一个指向下一个描述进程的结构体的指针。

struct XXX
{//进程的各种属性!!!struct XXX* next;//结构体指针,指向下一个描述进程的结构体
}

在操作系统中我们常常把用来描述进程的struct结构体叫做PCBprocess control block,进程控制块

虽然现在我们并不知道里面具有什么,但是根据常识,我们可猜测出一些:

struct PCB
{//id 进程标识符//代码地址&&数据地址//状态//优先级struct PCB* next;
}

所以我们现在回过头再来看

我们知道程序是一个在磁盘上的一个普通文件,当我们执行程序时,操作系统会把它的代码与数据加载(拷贝)到内存上,而操作系统为了管理这些,所以为每一个"进程"创建了一个PCB,里面记录了各种代码,数据等东西(这里使用指针指向数据所在地址的方式记录)。同时使用链表将各个PCB管理起来,

因此在操作系统层面上就形成了一个struct PCB* process list链表,所以对"进程"的管理就变成了对proc list这个链表的进行增删改查的管理。

我们可能经常会听老师说进程在排队。

现在我们可以知道进程在排队就是对进程的管理,操作系统会把对应进程对应的PCB找到并放到对应的队列里。

所以进程也可以被看成:

进程 = 可执行程序 + 内核数据结构(PCB)

内核数据结构存在的意义:方便操作系统对进程进行管理!

Linux中进程的PCB具体是struct task_struct{},通过双链表将其连接起来

2.进程标识符pid

每一个进程都有一个对应的pid

查看当前进程的信息:

ps ajx

这个是查看当前所有进程的信息,不利于我们查看我们想看的进程信息,

我们写一个无限循环的程序,并执行

#include<stdio.h>
#include<unistd.h>int main()
{while(1){printf("这是一个进程\n");sleep(1);}return 0;
}

然后指令:

ps ajx | head -1 && ps ajx | grep mybin
//ps ajx |  head -1 将进程信息的第一行打印出来
//ps ajx | grep mybin 将含有mybin的进程打印出来

我们运行的所有指令,软件,自己写的程序,最终都是进程!!!

3.系统调用函数getpid()

如果每次查看一个进程的pid,都要使用ps指令,会过于麻烦。这里我们可以通过系统调用函获取进程的pid,在程序中打印进程的pid。

函数:

getpid()

使用man手册查看getpid()的使用方法:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{pid_t id=getpid();while(1){printf("我是一个进程,我的pid是:%d\n",id);sleep(1);}return 0;
}

pid的作用:

1.标识一个进程

2.用户可以通过pid来对进程做管理。

4.在Linux下使用指令终止进程

在程序运行中我们可以在运行的地方按CTRL+c来结束进程,同时我们还可以使用指令:

kill -9 要杀掉进程的pid

(注:这里-9是信号参数,直接使用即可)

5.父进程与子进程

在Linux中,登录后,命令行多次执行同一程序时,对应的pid时不断变化的,但是其ppid是不变的,那么ppid是什么呢?

ppid是当前进程的父进程的pid

那么这个父进程是谁呢?

这里我们需要知道,在Linux中创造进程的方式:

1.命令行中直接启动进程--手动启动

2.通过代码创建进程

这里不论你是如何创建进程的,启动进程的本质是创建进程,一般是通过父进程创建的。在创建进程时,会创建PCB来管理这个进程,里面的内容一般会用父进程PCB里的东西进行初始化(这个关系我们叫做父子关系)

这里我们通过命令行启动的进程的父进程,是bash

1.通过系统调用接口getppid获取父进程的pid

首先用man手册查看getppid的用法。

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{printf("我是一个进程,我的pid是:%d,  我的ppid:%d\n",getpid(),getpppid());return 0;
}

查看进程的第二种方式:

查看进信息除了了ps指令外,还有另一种方式。

在Linux下,有一个动态的目录结构,存放所有进程的信息,目录的名称就是以这个进程的pid命名的。这个目录是proc

当我把这个进程杀掉后,617这个目录就会消失

每一个进程都能找到自己的可执行程序

在查看进程的信息是,我们发现其中的exe指向了我们可执行文件的路径。在Linux中进程知道自己在磁盘上的文件在哪里。

当我们把进程在可执行程序磁盘上的可执行文件删掉后,我们正在执行的进程仍可以正常进行

原因:我们已经把进程的可执行文件拷贝到了内存上,因此磁盘上可执行文件删除并不会影响到正在执行的进程,但是却无法再次执行了。

同时当我们删除后,exe执行的路径变红

每一个进程,都要有自己的工作目录

进程的工作目录的作用:

这里我们结合代码说明:

注:当前目录为空目录。

#include<stdio.h>
#include<sys/types.h>
#incldue<unistd.h>int main()
{FILE* fp=fopen("1.txt","w");if(fp==NULL)return 1;fclose(fp);return 0;
}

我们清楚的知道这段代码会在当前目录下创建一个1.txt的文件。

你觉得什么是当前目录呢?

当前目录全程:当前工作目录(缩写为cwd)

在进程创建时会记录当前目录cwd(即当前目录的路径),在使用1.txt相对路径创建文件时,系统会默认创建文件的路径是cwd/1.txt。这也就是为什么在我们使用相对路径创建文件时,这个文件会创建在cwd中。

默认情况下,进程启动所处的路径就是进程的当前路径。

使用系统调用接口chdir()修改cwd(当前工作目录)

在/home/wzy/test1目录中运行程序

注:/home/wzy/test2为空目录。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{chdir("/home./wzy/test2");//把当前前目录修改为/home./wzy/test2FILE* fp=fopen("1.txt","w");//在当前目录下创建1.txt文件if(fp==NULL)return 0;fclose(fp);return 0;
}

 

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

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

相关文章

Qt设置类似于qq登录页面(ikun)

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QWindow> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton>QT_BEGIN_NAMESPACE namespace Ui { class…

Prompt提示优化工具

在大模型使用过程中,Prompt尤为重要。一个好的Prompt可以解决很多的问题。那么如何撰写一个完美的Prompt? 下面汇总了一些Prompt工具,可以辅助日常Prompt的编写。 欢迎关注公众号 1. prompt perfect 可以自动优化已有的提示,比较多个模型的输出,运行智能体等。 https:…

带大家做一个,易上手的家常土豆炒瘦肉(糖醋水果版)

先那一块瘦肉 用水化冰 拿一颗土豆 去皮切成小块 瘦肉洗干净 然后切成小块 与土豆混在一起 打一个鸡蛋 将 鸡蛋液 一小勺淀粉 小半勺生抽 一小勺料酒 用手抓均匀 起锅烧油 倒入瘦肉土豆 翻炒 看肉变色了 加入 一包番茄酱(可以多放一点 味道足一点) 小半勺老抽调色 小半…

文献速递:PET-影像组学专题--影像组学和肺癌免疫治疗反应:文献系统综述

文献速递&#xff1a;PET-影像组学专题–影像组学和肺癌免疫治疗反应&#xff1a;文献系统综述 01 文献速递介绍 肺癌&#xff08;LC&#xff09;是全球癌症相关死亡的主要原因&#xff0c;尽管在诊断和治疗方面取得了进展[2,3]&#xff0c;但它仍然对公共健康构成严重威胁[…

Android : Room 数据库的基本用法 —简单应用_一_入门

1.Room介绍&#xff1a; Android Room 是 Android 官方提供的一个持久性库&#xff0c;用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层&#xff0c;使得使用 SQLite 数据库变得更加容易和方便。 以下是 Android Room 的主要特点&#xff1a; 对象关系映射…

无代码,零基础!手把手教你掌握Stable Diffusion,创作出惊艳AI插画!

【前言】 Stable Diffusion是一款开源、免费的应用程序&#xff0c;因为其生态开放且发展迅速&#xff0c;所以不同时期的安装、配置方式可能都会有所变化。如果遇到什么安装上的问题可以评论提出&#xff0c;帮你解答。 关于Stable Diffusion Stable Diffusion&#xff08;简…

IDEA中工具条中的debug按钮不能用了显示灰色

IDEA中工具条中的debug按钮不能用了显示灰色 1. 问题描述 IDEA上的DEBUG按钮突然变成了灰色&#xff1a; 2. 解决办法 一通搜索&#xff0c;终于找到解决办法 点击 File -> Project Structure如下图操作 3. 重启&#xff0c;解决 4. 参考 https://www.cnblogs.com…

自学编程推荐一个容易学的中文编程工具,构件箱之单选框组简介

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础轻…

C语言之基本数据类型和数

目录 算数类型和基本数据类型 基数 基数转换 由八进制数、十六进制数、二进制数向十进制数转换 由十进制数向八进制数、十六进制数、二进制数转换 二进制和十六进制的基数转换 在学习基本数据类型之前我们先来学习数。 算数类型和基本数据类型 在前面的学习中我们可以使用…

Docker 设置国内镜像源

Docker 设置国内镜像源 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 具体配置如下&#xff1a; {"registry-mirrors" : ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirro…

Flutter Dart FFI Pointer<Uint8>类型如何转成数组或String

前言 继上一次发布的 Flutter 直接调用so动态库&#xff0c;或调用C/C源文件内函数 内容&#xff0c;最终我选择了第二种方式&#xff0c;直接把整个 Native C 的项目源代码放进了 Flutter 工程里编译&#xff08;放在iOS的目录是因为它不支持自定义源码路径&#xff0c;Andro…

阶段十-java新特性

JDK9新特性 1.模块化系统 jar包结构的变化 jar -》model -》package -》class 通过不同的模块进行开发 每个模块都有自己的模块配置文件module-info.java 2.JShell JDK9自带的命令行开发&#xff0c;在进行简单的代码调试时可以直接编译使用 可以定义变量&#xff0c;方法&…

大数据与人工智能——神经网络是如何工作的?

大数据与人工智能——神经网络是如何工作的&#xff1f; 我们习惯于去了解所使用工具、中间件的底层原理&#xff0c;本文则旨在帮助大家了解AI模型的底层机制&#xff0c;让大家在学习或应用各种大模型时更加得心应手&#xff0c;更加适合没有AI基础的小伙伴们。 一、GPT与神…

Java实现机考程序界面

机考界面如下&#xff08;单选题&#xff09;&#xff0c;上方是题目状态&#xff0c;下方是题目&#xff0c;1/5/1是已做题目数量、总共题目数量和答对题目数量。 再看一下多选题的界面。 判断题的界面。 回答正确时的反馈&#xff0c;会给出用时。 回答错误时的反馈&#xff…

社会不教,精英不讲,坎儿还得自己过(揭秘人才成长规律)

推荐大家去看看天涯社区的精华帖子&#xff1a;《社会不教&#xff0c;精英不讲&#xff0c;坎儿还得自己过&#xff08;揭秘人才成长规律&#xff09;》 原出处天涯精华帖&#xff1a;《社会不教&#xff0c;精英不讲&#xff0c;坎儿还得自己过&#xff08;揭秘人才成长规律&…

【教3妹学编程-算法题】消除相邻近似相等字符

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2…

解决mfc140.dll丢失的方法有哪些?分享3个实测有效的方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法加载某某.dll文件”。这些错误通常会导致程序无法正常运行&#xff0c;给用户带来很大的困扰。而mfc140.dll文件丢失就是其中之一。本文将介绍3个解决mfc14…

深入理解Java虚拟机---类加载机制

类加载机制 什么是类加载机制类加载的时机类加载的过程加载验证文件格式验证元数据验证字节码验证符号引用验证 准备解析初始化 类加载器双亲委派模型 什么是类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff…

《PySpark大数据分析实战》-06.安装环境准备

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

Kafka集成springboot

安装kafka&#xff0c;直接到官网下载bin文件&#xff0c;本文使用windows进行使用kafka。 下载之后&#xff0c;第一步&#xff0c;启动zookeeper&#xff1a; zookeeper-server-start.bat ..\..\config\zookeeper.properties 第二步&#xff0c;启动kafka&#xff1a; kafka…