【Linux】Linux进程基础

news2024/11/24 15:18:21

1.进程介绍与概念

进程的本质是在计算机内存中运⾏的程序,但是这⼀个概念太过于⼴泛

每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。

要了解进程,⾸先采⽤前⾯在操作系统基础中介绍的思想「先描述,再组织」,每⼀ 个进程本质也是⼀个结构(⼀般称为PCB(Process Control Block,进程控制 块),在Linux下的PCB称为 task_struct ),计算机将程序加载到内存,就会在 内存中添加⼀个进程,那么此时就会形成⼀个结构体,该结构体中存在进程的⼀些描 述,例如进程的在内存中的位置、进程的编号、对应数据和代码的地址等,在程序执 ⾏前,进程会被排列到⼀个数据结构,通过操作系统调度器从数据结构中取出进程就 代表对应的进程获取到CPU的使⽤权,此时就会通过对应进程的结构体中的相关数据 加载代码和数据进⾏运算、逻辑处理,从⽽到达执⾏程序的效果

这⼀过程可以看出,进程=程序代码和数据+进程结构体 进程可以粗略得分为两种:

1. 执⾏完对应代码就退出

2. ⼀直运⾏在后台,也被称为「常驻进程」

2.Linux下查看进程

⾸先,通过下⾯的C语⾔代码创建⼀个进程:

#include <stdio.h>
#include <unistd.h>
 
int main() 
{    
    while(1) {
        printf("hello world\n");
        sleep(1);
    }
 
    return 0;
}

对应的Makefile代码如下:

TARGET=process 
SRC=process.c
 
$(TARGET):$(SRC)
    gcc -o $@ $^
 
.PHONY:clean
clean:
    rm -rf $(TARGET)

编译运⾏前⾯的C语⾔代码,并在Linux下查看对应进程

可以使⽤下⾯的⽅式:

ps ajx | head -1 && ps ajx | grep process
 
# 如果存在部分干扰信息,可以使用结合管道和grep的-v指令对部分干扰信息的关键字进行过滤

上⾯的指令中的 ps ajx代表查看当前系统运⾏时所有的进程以及部分信息,直接执 ⾏就可以看到进程信息

可以看到对应的进程为:

在Linux下实际上进程都被保存在⼀个名为 proc 的⽬录下,这个⽬录不是存在于磁 盘中的⽬录,⽽是操作系统运⾏时进程出现创建的,使⽤下⾯的命令查看该⽬录:

ls /proc

proc ⽬录在根⽬录下,与 home ⽬录同级

再次运⾏前⾯的C语⾔代码,使⽤下⾯的代码查看程序进程信息以及在 proc下的位置

3.结束进程的方式

在Linux下,可以使⽤两种⽅式结束进程:

1. 快捷键 ctrl+c

2. 使⽤ kill 指令: Kill -9 进程PID

4.进程对应程序文件位置

在前⾯C语⾔程序对应的进程⽬录中除了可以看到 cwd 以外,还可以看到⼀个名为 exe 的软链接,该链接指向着⼀个路径,如下:

该路径对应的即为加载到内存中的代码和数据(进程组成的⼀部分),如果在运⾏时 将该路径下的 process ⽂件删除,此时已经运⾏的进程不会受到影响,因为对应的 代码和数据已经加载进内存,受影响的只是下⼀次⽆法直接使⽤运⾏程序的⽅式创建 进程

删除后再次查看结果如下:

5.进程PID与 PPID

PID 是Linux系统下每⼀个进程对应的⼀个编号,该编号会因为进程产⽣的时间不同 ⽽不同,例如每⼀次运⾏前⾯的C语⾔代码都会得到⼀个不同的PID

如果想获取到当前进程的 PID 可以使⽤getpid()函数 该函数原型如下:

 pid_t getpid(void);

其中p id_t 类似于 long 类型,是⼀个⻓整型,该函数不需要传递形参

在前⾯的C语⾔代码中添加该函数并打印该进程的 PID 对⽐使⽤指令查看进程信息下的PID

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
int main() 
{   
    pid_t id = getpid();
    while(1) {
        printf("hello world, pid = %d\n", id);
        sleep(1);
    }
 
    return 0;
}

可以看到PID⼀致

⼀般连续创建的进程,PID 是连续的     PID 是进程的编号    PPID 是指定进程的⽗进程的编号,当前进程也被称为对应⽗进程的⼦进程

同样,在代码中想获取到当前进程的⽗进程对应的 PPID ,可以使⽤ getppid() 函 数,原型如下:

pid_t getppid(void);

对前⾯C语⾔的代码进⾏修改,如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
int main() 
{   
    pid_t id = getpid();
    pid_t pid = getppid();
    while(1) {
        printf("hello world, pid = %d ppid = %d\n", id, pid);
        sleep(1);
    }
 
    return 0;
}

多次运⾏代码后结果如下:

可以发现,每⼀次运⾏代码, PID 都会改变,但是 PPID 始终不变,因为其⽗进程始 终是同⼀个进程,通过查看进程的指令可以找到 PID 为14901对应的⽗进程:

bash 是Linux下的指令解释器,每⼀次执⾏指令时,实际上就是将对应的指令交给 了bash,由 bash 再交给操作系统进⾏执⾏,当执⾏上⾯程序的进程时,实际上是 创建了⼀个 bash 的⼦进程,再由⼦进程执⾏对应的程序代码和数据

6.创建子进程 fork

6.1简单了解 fork函数

fork 函数原型如下:

pid_t fork(void);

在Linux编程⼿册中对 fork 的解释如下:

对应的函数返回值的解释如下:

⼤意为:成功的情况下,该函数返回⼦进程的 PID 给⽗进程,返回0给⼦进程。失败 的情况下,该函数返回-1给⽗进程,不创建任何⼦进程,并恰当设置错误代码

6.2简单使用 fork函数

根据前⾯对 fork 函数的介绍,修改前⾯的C语⾔代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
int main() 
{   
    pid_t id = fork();
    if(id > 0) {
        printf("I am prarent process, my pid = %d my ppid = %d\n", getpid(), getppid());
    } else if(id == 0) { 
        printf("I am child process, my pid = %d my ppid = %d\n", getpid(), getppid());
    }
    return 0;
}

运行结果如下:

可以看到,⼦进程的 PPID 即为⽗进程 PID ,与前⾯的思想对应

7.简单了解 fork细节

上⾯的代码中⼀共存在着三个待解决的问题:

1. 使⽤ fork 创建⼦进程,为什么可以通过if 和 else if区分⼦进程和⽗进程

对于第⼀个问题来说,根据 fork 函数的返回值描述,当函数运⾏成功的情况下,会 返回⼦进程的 PID 给⽗进程, PID ⼀般都是⼤于0的,⽽⼦进程会收到 返回值为0,所以当上⾯代码中的id变量⼤于0时,就会⾛ fork 函数的 if 语句,⽽唯⼀⼀个接 收到的id⼤于0的就是⽗进程;同理,⼦进程的id变量等于0,就会⾛ else if 语句。

2. 为什么 fork 函数出现了两个返回值

对于第⼆个问题来说,实际上执⾏ fork 函数时,在返回 pid 之前就已经执⾏完了创 建⼦进程逻辑,此时⽗进程和⼦进程共享代码,但是各⾃独⽴数据,⽗进程拥有⾃⼰ 的返回值,⼦进程也拥有⾃⼰的返回值,所以此时 return 的时候是每个进程返回各 ⾃的返回值

3. 为什么两个分⽀语句if和 else if都执行了

对于第三个问题来说,当代码执⾏到 fork 函数时,会执⾏ fork 函数的内部逻辑, 再执⾏完其主逻辑代码后,就已经创建出了⼦进程(对应存在⼀个⼦进程的 task_struct ),此时⼦进程会与⽗进程共享同⼀块代码,但是⼦进程拥有⾃⼰的 数据,并使⽤⾃⼰的数据执⾏代码。⽽之所以需要共享同⼀块代码,是因为⽗进程的 代码是从硬盘中加载的,但是⼦进程的代码并不存在与硬盘,从⽽也就⽆法加载,⽽ 之所以不同的进程有着不同的数据,这是进程独⽴性的主要体现,可以⽤下图先简单 理解这个过程,具体过程会在进程地址空间讲解:

此处,⼦进程的 task_struct 实际上先是对⽗进程的task_struct 的拷⻉,再对其中的内容进⾏⼀定的修改;

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

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

相关文章

ui自动化知识点-web端

UI &#xff1a; User Interface( ⽤户接⼝ - ⽤户界⾯ ) &#xff0c;主要包括&#xff1a; app 、 web ui ⾃动化测试&#xff1a;使⽤⼯具或代码执⾏⽤例的过程 什么样的项⽬适合做⾃动化&#xff1a;1、需要回归测试项⽬&#xff08;甲⽅⾃营项⽬、⾦融、电商&#xff09…

鸿蒙开发 三十七 ArkTs类 class 构造函数

语法格式如下&#xff1a; class 类名{ 字段1:类型 字段2:类型 constructor(参数...) { this.字段 参数 } } 实例化&#xff1a; const 实例1 new 类名(参数...&#xff09;每new一次就去执行一次constructor方法&#xff0c;创建不同的实例。 每次new都要传参数&…

MySQL学习笔记(持续更新,目前到十一章锁)

1、Mysql概述 1.1 数据库相关概念 三个概念&#xff1a;数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System&#xf…

C++ -string -常见用法1

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;前言1.构造函数1.1函数原型1.2用法速览1.3详解() -重点⭐( s) -重点⭐( n, c) -重点⭐( str) -重点⭐( str, pos, len)( s, n) 2.容量函数2.1函数原型2…

github 上将 stable 合并到 master 分支步骤

本地仓库分支&#xff1a;origin 远端仓库分支&#xff1a;upstream 切到非 master 分支上&#xff0c;比如 dev # 本地操作 git branch -D master git fetch upstream master::master git checkout master # 这步是拉取远端 stable 到 master 上&#xff0c;可能会出错误 # fa…

21次惊艳亮相!凯特王妃的秋季时尚造型!在时尚领域她已经无限接近戴安娜王妃

虽然凯特米德尔顿正式成为英国王室成员才刚刚十多年&#xff0c;但很难想象没有她的王室会是什么样子。毕竟&#xff0c;凭借她非凡的风格和不可否认的魅力&#xff0c;威尔士王妃在2011年迅速赢得了我们以及全世界的喜爱。 我们都喜欢关注她的项目以及她和威廉王子的爱情故事…

基于STM32的智能电能表设计

引言 本项目设计了一个基于STM32的智能电能表&#xff0c;能够实时测量电压、电流、功率以及累计的电能消耗。通过ADC模块采集电压和电流信号&#xff0c;结合功率计算算法&#xff0c;系统可以精准地监控家庭或工业设备的电能消耗。该智能电能表还支持远程数据传输和本地数据…

Krea.ai正式发布AI视频集合站:Luma、Runway与可灵的深度整合

引言 在数字内容日益丰富的今天&#xff0c;视频制作的需求呈现爆发式增长。为了满足创作者对高效、创新视频工具的渴求&#xff0c;Krea.ai推出了全新的AI视频集合站。此平台整合了多款领先工具&#xff0c;如Luma、Runway、可灵和Minimax&#xff0c;为用户提供一站式的视频…

【等号绕过】

简介 一、大小于号绕过 上面的<>是不等于的意思 测试注入点&#xff1a; id1 正常输入id1 测试是否有注入id1 and 11%23 提示hacker~ 被过滤了id1 and 1%23 没有被过滤&#xff0c;说明是被过滤&#xff0c;但是没有输出id1 and 1%23 页面有输…

25四非网安保研回忆录(北航网安/东南网安/重大计科等)

目录 0 个人情况 1 夏令营 西南大学计科 西南交通大学计科 重庆大学计科 2 预推免 东南大学网安 北京航空航天大学网安 3 写在最后 0 个人情况 计算机类比较强的四非&#xff0c;信安专业rank1&#xff0c;六级540&#xff0c;竞赛十几个&#xff0c;无论文&#xff…

【Linux网络编程】网络基础 | Socket 编程基础

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

2.13寸电子墨水屏HINK-E0213+esp8266

记录好数字 2.13寸电子墨水屏HINK-E0213esp8266 声明:大部分资料来源于微雪电子http://微雪电子-官网 https://www.waveshare.net/ 前言 很久以前买的一块电子墨水屏,运气很好,这个型号HINK-E0213资料很全,而且微雪官网也有相关电路资料http://2.13inch e-Paper HAT - Waves…

java邮件发送

文章目录 前言一、开启SMTP邮箱配置二、spring-mail1.引入依赖2.yml配置3.使用二、hutool-mail1.引入hutool2.在resource下新增mail.setting3.使用总结前言 发送邮件: 目前比较简单的有两种方式实现: spring-mailhuool-mail现在看下两种方式 一、开启SMTP邮箱配置 两种方式…

mysql查询2张表连接列名一样的情况

people表&#xff1a; person表&#xff1a; SELECT * FROM person LEFT JOIN people on people.idperson.id 查询的结果id(1)和name(1)说明列名重复 SELECT person.id,person.name,people.id as pid,people.name as pname FROM person LEFT JOIN people on people.idperso…

Linux shellcheck工具

安装工具 通过linux yum源下载&#xff0c;可能因为yum源的问题找不到软件包&#xff0c;或者下载的软件包版本太旧。 ShellCheck的源代码托管在GitHub上(推荐下载方式)&#xff1a; GitHub - koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts 对下…

10.高级存储过程技巧(10/10)

高级存储过程技巧博客大纲 引言 在现代数据库管理系统中&#xff0c;存储过程作为提升数据操作效率和安全性的关键工具&#xff0c;已被广泛应用于各种数据库操作中。存储过程是一组为了完成特定功能的SQL语句集合&#xff0c;这些语句在数据库中被保存、编译和优化&#xff0…

Chromium 前端window对象c++实现定义

前端中window.document window.alert()等一些列方法和对象在c对应定义如下&#xff1a; 1、window对象接口定义文件window.idl third_party\blink\renderer\core\frame\window.idl // https://html.spec.whatwg.org/C/#the-window-object// FIXME: explain all uses of [Cros…

【原创】java+springboot+mysql在线课程学习网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

陪诊小程序搭建:打造便利的陪诊环境

陪诊行业作为一个新兴行业&#xff0c;随着老龄化的严重&#xff0c;在近几年中需求量日益旺盛。陪诊师为大众的就医提供了极大的便利性&#xff0c;在看病难、医疗资源紧张方面发挥了积极作用。 在陪诊行业的快速发展下&#xff0c;陪诊小程序为行业带来了便捷的模式&#xf…

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-ce…