系统编程—进程

news2024/11/15 17:52:04

一、进程的概念

1.程序与进程的区别

        程序:编译后产生的,格式为ELF的,存储于硬盘的文件。可以通过     readelf -s [文件名]   查看文件信息                                                                                                                                                 进程:程序中的代码和数据,被加载到内存中运行的过程。当程序被CPU加载时,根据每一行代码做出相应的效果,形成动态的过程,那么这个过程就是进程。 其实说白了,进程就是一个正在执行的程序。                                                                                                                                          程序是静态的概念,进程是动态的概念

2 .开启进程

直接在linux下,执行一个程序,就会开启相应的进程。

例如: ./main -> 开启一个名字为hello的进程。

3当进程开启之后,系统会为进程分配的资源

(1)会分配进程对应内存空间

int x;   //运行程序后,会向栈空间申请四个字节的空间

(2)进程在系统内核中如何进行表示呢

学生管理系统 ----------->每个学生使用结构体进行表示和管理

     linux系统   ----------->每个进程使用结构体进行表示和管理

当进程开启之后,会为这个进程分配一个任务结构体,这个任务结构体就是用于描述这个进程的。也就是说,进程在内核中是以结构体struct task_struct{} 进行表示的。这个结构体也被称之为进程控制块。

结构体:进程ID号、信号、文件、资源....

/usr/src/linux-headers-3.5.0-23/include/linux/sched.h 

二、关于进程的命令

1.可以使用命令pstree查看这些进程的关系

可以看到,最开始的系统进程叫systemd,这个进程的诞生比较特别,其身份信息在系统启动前就已经存在于系统分区之中,在系统启动时直接复制到内存。

2.ps查看进程ID号

ps -ef/-elf  静态显示

3.top查看进程CPU的占用率

三、进程的状态

1.什么是僵尸态?

进程结束时,就从运行态变成僵尸态,所谓僵尸态,就是代表这个进程所占用的CPU资源和自身的任务结构体没有被释放,这个状态的进程就是僵尸态进程。

2.总结:

1)进程在暂停态时,收到继续的信号时,是切换到就绪态,而不是运行态。

2)程序的main函数执行return 0就会导致进程的退出,一定会变成僵尸态。

3)进程不可以没有父进程,也不能同时拥有两个父进程。

4)孤儿进程特征就是失去父进程时,会马上寻找继父,而不是等到孤儿进程变成僵尸态再找。

5)祖先进程一定要帮其他的进程回收资源。

四、进程的创建

1.创建一个进程

pid_t fork(void);  // 返回值   失败-1

                           // 大于0 id号代表子进程的ID号    =0

结果1:父进程先运行,子进程后运行

在这里,只有父进程退出,才会出现命令行,子进程退出是不会出现命令行

 结果2:子进程先运行,父进程后运行

2.想确保子进程先运行,就要父进程先睡眠

getpid----》返回自己的ID号
getppid---》返回父进程的ID号

五、僵尸进程和孤儿进程

1.概念

        孤儿进程:一般情况下,调用fork()函数创建的子进程,父进程如果比子进程先退出,那么这个子进程称之为 孤儿进程。那么,祖先进程systemd 就会成为该子进程的父进程,回收该子进程的资源。

       僵尸进程:父进程还存在,但是去做的别的事情了(比如在一个死循环,没有退出),此时子进程退出之后,就变成了僵尸进程。
(可以用ps -ef 查看,进程的状态栏为defunct,这就是所谓的“僵尸”进程)

2.僵尸进程

3.孤儿进程

4、解决僵尸态问题

父进程应当调用wait()waitpid()函数来等待子进程的结束,并回收子进程的资源。这是解决僵尸进程问题的最直接方法。

(1)wait()

pid_t wait(int *status);

  • int *status:这是一个指向整数的指针,用于接收子进程的退出状态。这个参数是可选的,如果你不关心子进程的退出状态,可以传递NULL。如果传递了一个非NULL的指针,系统将通过该指针返回子进程的退出状态信息。
  • pid_t:函数返回结束的子进程的PID。如果调用进程没有子进程,则返回-1,并设置errno为ECHILD。如果出现其他错误,也会返回-1,但errno会设置为相应的错误代码。

(2)waitpid()

#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *status, int options);

参数

  • pid:指定要等待的子进程的PID。

    • 如果 pid 大于 0,则等待与 pid 相等的子进程。
    • 如果 pid 等于 0,则等待任何子进程(与 wait() 类似,但具有 options 提供的额外控制)。
    • 如果 pid 等于 -1,则等待任何子进程,其行为与 pid 为 0 时类似,但某些系统实现可能会为 -1 提供不同的处理(如处理孤儿进程)。
    • 如果 pid 小于 -1,则等待组ID等于 pid 绝对值的任何子进程。
  • status:指向整数的指针,用于接收子进程的退出状态。与 wait() 一样,这个参数是可选的。

  • options:一个或多个选项标志的位或(bitwise OR),用于修改 waitpid() 的行为。常见的选项包括:

    • WNOHANG:如果指定的子进程没有结束,则立即返回0,而不是阻塞。
    • WUNTRACED:返回因停止信号而停止的子进程的状态。

      返回值

    • 成功时,waitpid() 返回结束或停止的子进程的PID。
    • 如果 WNOHANG 被设置且没有子进程结束,则返回0。
    • 如果出现错误,则返回-1,并设置errno以指示错误。

六、进程的退出与回收

1、exit()

#include <stdlib.h>

void exit(int status);

  • 功能:终止当前进程,执行清理操作(如调用 atexit() 注册的函数、刷新标准I/O缓冲区),并返回给操作系统一个状态码。
  • 参数int status(整型),表示进程的退出状态码。通常,0 表示成功,非0 值表示某种错误或特定状态。
  • 头文件<stdlib.h>

2._exit()

  • 功能:立即终止当前进程,不进行任何清理操作(如调用 atexit() 注册的函数、不刷新标准I/O缓冲区),并返回给操作系统一个状态码。
  • 参数int status(整型),表示进程的退出状态码。
  • 头文件<unistd.h>(注意,这个头文件在Windows中不可用,是POSIX系统的一部分)

3._Exit()

  • 功能:与 _exit() 类似,立即终止当前进程,不进行任何清理操作,并返回给操作系统一个状态码。它是C99标准中引入的,旨在提供一种可移植的方式来执行 _exit() 的功能。
  • 参数int status(整型),表示进程的退出状态码。
  • 头文件<stdlib.h>(注意,尽管 _Exit() 在 <stdlib.h> 中声明,但它的实现可能依赖于系统调用 _exit(),后者通常在 <unistd.h> 中定义)

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

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

相关文章

使用OpenRewrite升级SpringBoot项目

使用OpenRewrite升级SpringBoot项目 什么是OpenRewrite? OpenRewrite是一个强大的开源自动化源代码重构工具,专为大规模代码库设计。它的核心理念是通过程序化的方式来改变源代码,而不是依赖于手动编辑或简单的查找替换。 OpenRewrite的主要特点和优势包括: 自动重构: Open…

Unity动画模块 之 Animator中一些常见参数

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 我发现我忘了写Animator了&#xff0c;正好有些不常用的参数还没怎么认识,笔记来源于唐老狮 1.状态窗口参数 2.连线参数…

Lesson05--C/C++内存管理

1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 7. 常见面试题 1. C/C内存分布 为了方便管理内存被分为了以上的区域 我们来看下面的一段代码和相关问题 …

数据结构(邓俊辉)学习笔记】优先级队列 08——左式堆:结构

文章目录 1. 第一印象2. 堆之合并3. 奇中求正4. NPL5. 左倾性6. 左展右敛 1. 第一印象 在学习过常规的完全二叉堆之后&#xff0c;我们再来学习优先级队列的另一变种&#xff0c;也就是左式堆。所谓的左式堆&#xff0c;也就是在拓扑形态上更加倾向于向左侧倾斜的一种堆&#…

Vue3 项目结构

1.main.ts 2.简单写一个src下的结构 App.vue 根组件 <template><div class"app"><!-- html --><h1>你好啊!</h1></div> </template><script lang"ts"> //js 或 tsexport default {name:App,//组件名 }…

MySQL数据库锁机制(全面讲解)

目录 1、全局锁 1.1、全局锁使用语法 1.2、备份数据库&#xff08;不使用全局锁&#xff09; 2、表锁 2.1、读写锁 读锁 写锁 2.2、元数据锁&#xff08;meta data lock MDL&#xff09; 2.3、意向锁 3、行锁 3.1、共享锁和排他锁 共享锁&#xff08;S锁&#xff…

原来marker还能这么玩

在Web GIS开发中&#xff0c;Marker&#xff08;标记&#xff09;是一个基本但强大的工具。今天&#xff0c;我们将探讨如何通过不同的API调用&#xff0c;将Marker玩出新花样&#xff0c;让地图更加生动有趣。 最基础的Marker用法是在地图上标记一个具体位置。我们可以通过“m…

【Unity3D小技巧】Unity3D中实现对InputField的自定义输入限制实例

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 InputField是UGUI的文本输入框&#xff0c;自带的…

粘包,Telnet,SSH,Wireshark

一&#xff0c;粘包 原因&#xff1a;tcp为流式套接字&#xff0c;数据与数据间没有边界&#xff0c;导致多次数据粘到一起。 解决&#xff1a; 1.规定一些数据间的间隔符&#xff0c;"\aa","\r\n"; 2.可以指定要发送对象的数据长度。 3.自己将数据打包。 …

力扣:有效的数独

文章目录 需求分析结尾 需求 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08…

2024年最新最全的【大模型学习路线规划】从零基础入门到精通!

2024年最新最全的大模型学习路线规划&#xff0c;对于零基础入门到精通的学习者来说&#xff0c;可以遵循以下阶段进行&#xff1a; 文章目录 一、基础准备阶段数学基础&#xff1a;编程语言&#xff1a;深度学习基础&#xff1a; 二、核心技术学习阶段Transformer模型&#xf…

第2章-04-Request Header与Response Header

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

TortoiseGit使用教程

系列文章目录 文章目录 系列文章目录前言一、TortoiseGit下载安装二、使用步骤1.创建库1.需要上传的文件&#xff1a;不需要上传的文件&#xff1a; 2.拉取代码 前言 以前都是用svn&#xff0c;现在改用git Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&am…

IO进程day01(标准IO、缓存区)

目录 【1】标准IO 1》概念&#xff1a; 2》特点 【2】缓存区 1》全缓存&#xff1a;和文件相关 2》行缓存&#xff1a;和终端有关 3》不缓存&#xff1a;也就是没有缓存区&#xff0c;标准错误。 【1】标准IO 1》概念&#xff1a; 标准IO&#xff1a; 是在C库中定义的一…

Linux入门——10 信号

1.信号 1.信号------信号量&#xff08;两者没有任何关系&#xff09; 2.信号讲什么----->整个信号的生命周期 信号的产生-----信号的保存------信号的处理 之前的kill命令&#xff0c;用的就是信号。 kill -l查看系统支持的信号 名字本身就是宏&#xff0c;其实就是编…

java—1 封装

目录 一、零碎内容 一、输入、输出 二、idea项目结构 三、Java标识符的命名规范&#xff08;约定俗成&#xff09; 四. 方法和函数 二、快捷键 三、数组 1. 声明数组 2. 静态初始化 3. 数组动态初始化 4. 声明和初始化一起完成 5. 数组地址 四、面向对象编程 1. …

进程函数练习

创建子父进程&#xff0c;子进程将1.txt内容拷贝到2.txt中&#xff0c;父进程将3.txt内容拷贝到4.txt中。 #include <myhead.h>int main(int argc, const char *argv[]) {pid_t ID;ID fork();if(ID>0)//父进程{printf("父进程ID:%d\n",ID);int fd open(&…

C HTML格式解析与生成

cmake报错替换 if(NOT MyHTML_BUILD_WITHOUT_THREADS OR NOT MyCORE_BUILD_WITHOUT_THREADS) set(CMAKE_THREAD_PREFER_PTHREAD 1) if (WIN32) set(CMAKE_USE_WIN32_THREADS_INIT ON) set(CMAKE_THREAD_PREFER_PTHREADS TRUE) set(THREADS_PR…

Covalent Network(CXT)第二季度委托激励增长83%

Covalent Network&#xff08;CXT&#xff09;是一家领先的区块链数据解决方案供应商&#xff0c;拥有超过 230 条链的集成和数十亿个结构化数据点&#xff0c;专注于去中心化应用&#xff08;dApps&#xff09;和长期数据可用性。Covalent Network&#xff08;CXT&#xff09;…

C语言 之 整数在内存中的存储、大小端字节序和字节序的判断

文章目录 整数在内存中的存储大小端字节序和字节序判断大小端有大小端的原因高位和地位怎么区分&#xff1f;图例判断机器大端还是小端的例题 整数在内存中的存储 整数的2进制表示方法有三种&#xff0c;即 原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c…