当前位置: 首页 > news >正文

【Linux系统编程】第十七弹---进程理解

 ✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】

目录

1、进程的基本概念

2、描述进程-PCB

2.1、什么是PCB

2.2、为什么要有PCB 

3、task_ struct

3.1、启动进程

3.2、创建进程

3.3、一次创建多个进程

3.4、task_ struct内容分类

3.5、查看进程内容

总结


1、进程的基本概念

课本概念:程序的一个执行实例,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间,内存)的实体。

1. 如何用通俗易懂的话来理解进程呢???

进程 == PCB(进程控制块) + 进程对应的的代码和数据。一个进程对应一个PCB 。

注意:可执行程序加载到内存不是进程,只是进程对应的代码和数据。

2、描述进程-PCB

2.1、什么是PCB

进程信息被放在一个叫做PCB(进程控制块)的数据结构中,可以理解为进程属性的集合。

课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct。


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

struct PCB
{//所有属性struct PCB* next;//内存指针 
}

因此对进程的管理变成了对链表的增删查改。

2.2、为什么要有PCB 

因为操作系统要对进程进行管理,管理需要先描述再组织,而PCB是对进程的描述。


3、task_ struct

3.1、启动进程

1、./可执行程序,本质就是让系统创建进程并运行(包括:自己写代码形成的可执行程序,系统命令,可执行文件)。在Linux中运行的大部分指令操作,本质就是运行进程!!!

2、每一个进程都要有自己唯一的标识符,叫做进程的pid(进程id)。

3、一个进程,想知道自己的pid???

方式一:通过指令查看pid

ps指令:

语法:

ps [选项]

功能:

显示当前终端会话中属于当前用户的进程列表。

常见选项:

-a : 显示跟当前终端关联的所有进程

-j : 工作格式

-x : 显示所有进程,不以终端机来区分

此处使用固定格式查看:

ps -ajx | head -1 && ps -ajx | grep 可执行文件 

# &&表示前后命令都要按照顺序执行,此处表示先查看该命令的第一行再查看有关可执行程序的信息

方式二:通过调用系统函数

操作系统对进程进行管理,但是用户不能直接访问操作系统,因此需要通过系统提供的系统调用函数来管理进程。

查看pid的函数为getpid();

可以通过man手册进行查询,输入命令:  man getpid

通过创建一个C语言代码来查看pid:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{while(1){printf("I am a process,pid: %d\n",getpid());//查看pidsleep(1);//打印一次之后休眠一秒}return 0;
}

 

4、ctrl + c 在用户层面终止进程   kill -9 pid 杀掉进程

注意:kill掉任意一个进程不会影响另一个进程!!! (进程保证独立性)

5. ppid (父进程id)

前面获取pid的函数后面还有ppid函数,此处通过代码查看ppid。

为什么进程每次启动pid会变但是ppid不会变呢???

我们先查看一下父进程是什么,输入该命令:

ps -axj | head -1 && ps -axj | grep ppid

通过查看可以看到该进程是bash进程(命令行解释器),因此就很好理解了。

  • 当我们运行一个进程时,命令行解释器会把这个指令解释成bash的子进程。
  • 接着再由这个bash的子进程执行对应的命令。
  • 即:每一条命令被执行,都属于bash的子进程,只是子进程不一样。

如何理解子进程不一样呢?

就像我们高考考上北京大学,当年会给我分配一个学号,但是有一天我不想读了,我又重新高考进入北京大学,此时的学校还是北京大学,但是学号就不一样了。

补充:

为了更好看到执行程序与进程信息,可以使用shell脚本,隔一秒查一次进程

while : ; do ps ajx | head -1 && ps ajx | grep myprocess; sleep 1; done

3.2、创建进程

创建跟上面查看进程一样,需要调用系统提供的函数。创建进程的函数为fork();fork之后,父子代码共享。

使用man手册查看fork()函数,输入命令:man fork

创建一个进程,本质是系统中多了一个进程,多一个进程就多一个内核数据结构+自己的代码和数据。父进程的代码和数据从硬盘上加载来的。子进程的代码和数据从哪来呢?? 默认情况继承父进程的代码和数据。

怎么证明是子进程呢???

使用C语言代码创建进程来证明:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{fork();//创建进程printf("hello world,pid: %d,ppid: %d\n",getpid(),getppid());//查看进程对应信息return 0;
}

为什么要创建子进程?

我们想让子进程执行和父进程不一样的代码。提高运行效率。

接下来我们就对父子进程写入不一样的代码,此处需要用到fork函数的返回值。

 继续使用C语言代码来实现:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{printf("process is running,only me!,pid: %d\n", getpid());sleep(3);pid_t id = fork();if (id == -1) return -1; //进程创建错误直接退出else if (id == 0){//child 子进程代码while (1){printf("id: %d,I am child process,pid: %d,ppid: %d\n", id, getpid(), getppid());sleep(1);}}else{//parent 父进程代码while (1){printf("id: %d,I am parent,pid: %d,ppid: %d\n", id, getpid(), getppid());sleep(2);}}return 0;
}

 

1.不同进程执行不同的代码是实现出现了,但是同一个id怎么可能既是等于0,又是大于0?

此处与虚拟地址空间,父子进程写时拷贝有关,暂时不做讲解。

2. fork有两个返回值怎么解释呢???

fork是一个函数,只不过是OS(操作系统)提供的。

函数内部父子进程已经存在。可以被调度了。

由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

3.3、一次创建多个进程

创建多个进程实际就是多次使用fork函数即可,此处继续用C语言代码进行实现。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void RunChild()
{while (1){printf("I am a child process,pid: %d,ppid: %d\n", getpid(), getppid());sleep(1);}
}
int main()
{const int num = 5;for (int i = 0; i < num; i++){pid_t id = fork();if (id == 0){RunChild();//运行子进程代码}sleep(1);}while (1){sleep(1);printf("I am parent,pid: %d,ppid: %d\n", getpid(), getppid());}return 0;
}

补充:

为了更好看到执行程序与进程信息,可以使用shell脚本,隔一秒查一次进程,且不查看grep进程信息。

while : ; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; done

3.4、task_ struct内容分类

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

3.5、查看进程内容

ls /proc/pid  -d  # 按照目录查看

ls /proc/pid  -l   # 查看进程内容

使用一个简单的C语言代码测试:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{while (1){printf("I am process,pid: %d,ppid: %d\n", getpid(), getppid());sleep(1);}return 0;
}

注意:只有运行可执行程序才能查到该进程目录。

 该进程目录有很多内容,此处只截取了一部分内容,暂时我们需要知道的是两个链接文件,cwd(表示进程当前工作路径)---current work dir,exe(可执行程序路径)。

1. 如果我们在此处把可执行程序给删除,进程还会不会运行呢???

根据我们的现象是,进程还会运行,而且可执行程序也确实被删除了。进程还能继续运行的原因是,删除的是硬盘上的可执行程序,而原则上内存中还有该可执行程序(该可执行程序大小小于内存大小),但是进程超过内存的大小,运行则就可能出问题。

2. 当前工作路径有什么用呢?

我们在C语言中学习的文件操作,fopen("log.txt","w");默认是在当前目录创建文件,但是我们不一定每次都在当前目录创建文件,那怎么才能在其他目录下创建文件呢?这就是当前工作目录的意义。

修改当前工作路径需要用到一个函数,输入命令:man chdir

 测试代码:

#include<stdio.h>
#include<unistd.h>int main()
{chdir("/home/jkl");//更改工作目录为/home/jklFILE* pf = fopen("log.txt", "w");//创建文件(void)pf;//忽略警告 fclose(pf);while (1){printf("I am a process,pid: %d\n", getpid());sleep(1);}return 0;
}

每个进程在启动的时候,会记录自己在哪个路径下启动,进程的当前路径。

fopen("log.txt","w");   即会在进程的当前路径下新建文件

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

相关文章:

【Linux系统编程】第十七弹---进程理解

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程的基本概念 2、描述进程-PCB 2.1、什么是PCB 2.2、为什么要有PCB 3、task_ struct 3.1、启动进程 3.2、创建进程…...

【网络安全入门】你必须要有的学习工具(附安装包)零基础入门到进阶,看这一篇就够了!

工欲善其事必先利其器 在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧&#xff01; Web安全类 Web类工具主要是通过各种扫描工具&#xff0c;发现web站点存在的各种漏洞如sql注入、xss等。从而获取系统权限&#xff0c;常用的…...

【解决】:git clone项目报错fatal: fetch-pack: invalid index-pack output

象&#xff1a;之前一直使用gitee将个人学习和工作相关记录上传到个人gitee仓库&#xff0c;一直没出现过问题。直到有一天换电脑重新拉取代码发现出了问题&#xff0c;具体如下图&#xff1a; 原因分析&#xff1a; 经过查询发现主要原因是因为git clone的远程仓库的项目过大…...

python随机显示四级词汇

python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词&#xff0c;以及random库来随机选择单词。 使用after方法来定时更新窗口的位置&#xff0c;实现单词窗口的慢慢移动效果 使用…...

vuerouter声明式导航

声明式导航-跳转传参数 1.查询参数传参 语法&#xff1a;to /path?参数名值 2.对应页面组件接受传来的值 $router.query.参数名 2.动态路由传参 1.配置动态路由 2.配置导航连接 to/path/参数值 3.对应页面组件接收传递过来的值 #route.params.参数名 多个参数传递&…...

视频断点上传

什么是断点续传 通常视频文件都比较大&#xff0c;所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大小没有限制&#xff0c;但是客户的网络环境质量、电脑硬件环境等参差不齐&#xff0c;如果一个大文件快上传完了网断了没有上传完成&#xf…...

清华团队开发首个AI医院小镇模拟系统;阿里云发布通义千问 2.5:超越GPT-4能力;Mistral AI估值飙升至60亿美元

&#x1f989; AI新闻 &#x1f680; 清华团队开发首个AI医院小镇模拟系统 摘要&#xff1a;来自清华的研究团队最近开发出了一种创新的模拟系统&#xff0c;名为"Agent Hospital"&#xff0c;该系统能够完全模拟医患看病的全流程&#xff0c;其中包括分诊、挂号、…...

React Suspense与Concurrent Mode:探索异步渲染的新范式

React的Suspense和Concurrent Mode是两个强大的特性&#xff0c;它们共同改变了React应用处理异步数据加载和UI渲染的方式。下面我将通过一个简化的代码示例来展示如何使用这两个特性。 Concurrent Mode 和 Suspense 的基本用法 首先&#xff0c;确保你使用的是支持这些特性的…...

算法训练营day37

动态规划 1.斐波那契数 1.使用数组存储子问题结果 class Solution {public int fib(int N) {if (N 0) return 0;int[] dp new int[N 1];// base casedp[0] 0; dp[1] 1;// 状态转移for (int i 2; i < N; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[N];} }2.使用变…...

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

帧动画 帧动画也叫序列帧动画&#xff0c;其原理就是在时间轴的每帧上逐帧绘制不同的内容&#xff0c;使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力&#xff0c;本节笔者介绍一下 ImageAnimator 组件的简单使用。 官方文献 说明 该组件从A…...

vant NavBar 导航栏详解

vant 是一个基于 Vue 的移动端 UI 组件库&#xff0c;而 NavBar 是其中的一个导航栏组件。下面是对 vant 的 NavBar 导航栏组件的详细解释&#xff1a; 1. 引入 NavBar 首先&#xff0c;你需要在你的 Vue 组件中引入 NavBar 组件&#xff1a; import { NavBar } from vant; …...

Python自动化办公实战案例:文件整理与邮件发送

目录 一、引言 二、案例背景 三、实战案例 &#xff08;一&#xff09;文件自动整理 &#xff08;二&#xff09;邮件自动发送 四、结语 一、引言 随着办公自动化的兴起&#xff0c;Python作为一门强大的编程语言&#xff0c;逐渐被应用于日常办公中。从文件整理到邮件…...

2024中国(重庆)无人机展览会8月在重庆举办

2024中国(重庆)无人机展览会8月在重庆举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 报名&#xff1a;【交易会I 59交易会2351交易会9466】 展会背景&#xff1a; 为更好的培养航空航天产业和无人…...

自动驾驶技术与传感器数据处理

目录 自动驾驶总体架构 感知系统 决策系统 定位系统 ​计算平台​ 仿真平台​ 自动驾驶公开数据集 激光点云 点云表征方式 1) 原始点云 2) 三维点云体素化 3)深度图 4)鸟瞰图 点云检测障碍物的步骤 PCL点云库 车载毫米波雷达 车载相机 设备标定 自动驾驶…...

高效测评系统方案助力沃尔玛、亚马逊卖家提升产品销量

无论在哪个电商平台&#xff0c;测评确实是最有效的推广方式。测之前一定要选好产品&#xff0c;因为对于大部分卖家而言&#xff0c;不可能你店铺里所有的都是爆款&#xff0c;所以选择的是需要有潜力成为爆款的产品。测评是指通过搭建安全的环境模拟真实的买家购物行为&#…...

B/S模式的web通信(高并发服务器)

这里写目录标题 目标实现的目标 服务器代码&#xff08;采用epoll实现服务器&#xff09;整体框架main函数init_listen_fd函数&#xff08;负责对lfd初始化的那一系列操作&#xff09;epoll_run函数do_accept函数do_read函数内容补充&#xff1a;http中的getline函数 详解do_re…...

C语言每日一题—约瑟夫问题

13个人围成一圈&#xff0c;从第1个人开始顺序报号1、2、3&#xff0c;凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。***输出提示&#xff1a;"\n出圈成员及顺序&#xff1a;" ***输出格式&#xff1a;"%3d" ***输出提示…...

语言:C#

一、VSCode生成exe 二、...

[力扣题解]45. 跳跃游戏 II

题目&#xff1a;45. 跳跃游戏 II 思路 贪心法&#xff1b; 只需记录2个变量&#xff0c;当前点能达到的最远距离&#xff0c;和上一步能到达的最远距离&#xff1b; &#xff08;真有意思&#xff0c;代码随想录给出的是curDistance&#xff0c;nextDistance2个&#xff0c;…...

pywinauto操作windows应用(未完成)

pywinauto 脚本制作 一 、获取窗口句柄 首先获取句柄&#xff0c;其次扫描组件&#xff0c;然后对按钮和文本进行操作 安装依赖 pip install pywin32 -i https://pypi.doubanio.com/simple扫描全部的句柄 import win32gui# GetDesktopWindow 获得代表整个屏幕的一个窗口&a…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...