Linux并发程序设计(1):进程的创建和回收

目录

1、基本概念概念

1.1 程序

1.2 进程

1.3 进程的内容 

1.4 进程类型

1.5 进程状态 

2、常用命令 

2.1 查看进程信息 

2.2 改变进程优先级

2.2.1 按用户指定的优先级运行进程

2.2.2 改变正在运行进程的优先级

2.3 其他相关指令 

3、进程的创建和结束 

3.1 子进程创建

3.1.1 子进程概念

3.1.2 子进程创建-fork

3.1.3 父子进程 

3.2 进程结束

3.3 进程回收 

3.3.1 进程回收-wait 

3.3.2 进程回收 – waitpid 

4、代码实验

5、总结


1、基本概念概念

1.1 程序

存放在磁盘上的指令和数据的有序集合(文件)

静态的

1.2 进程

执行一个程序所分配的资源的总称; 

进程是程序的一次执行过程;

动态的,包括创建、调度、执行和消亡;

1.3 进程的内容 

  • BSS段:BSS段通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。
  • 数据段:数据段通常是指用来存放程序中已初始化的全局变量的一块内存区域。
  • 代码段:代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
  • 堆(heap):堆是用于存放进程运行中被动态分配的内存段,当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
  • 栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
  • 进程控制块(pcb):PID, 进程优先级,文件描述符表。

1.4 进程类型

  • 交互进程:在shell下启动。以在前台运行,也可以在后台运行;
  • 批处理进程:和在终端无关,被提交到一个作业队列中以便顺序执行;
  • 守护进程:和终端无关,一直在后台运行。

1.5 进程状态 

  • 运行态:进程正在运行,或者准备运行;
  • 等待态:进程在等待一个事件的发生或某种系统资源;
  • 停止态:进程被中止,收到信号后可继续运行;
  • 僵尸态:已终止的进程,但pcb没有被释放。

2、常用命令 

2.1 查看进程信息 

  • ps     查看系统进程快照
  • top    查看进程动态信息
  • /proc  查看进程详细信息
  • shift +> 后翻页
  • shift +< 前翻页
  • top -p PID  查看某个进程

ps 命令详细参数:

        -e:显示所有进程

        -l:长格式显示更加详细的信息

        -f 全部列出,通常和其他选项联用

2.2 改变进程优先级

2.2.1 按用户指定的优先级运行进程

        nice [-n NI值] 命令

  • NI 范围是 -20~19。数值越大优先级越低
  • 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
  • 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
  • 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

2.2.2 改变正在运行进程的优先级

    renice [优先级] PID

2.3 其他相关指令 

  • jobs   查看后台进程
  • bg     将挂起的进程在后台运行
  • fg      把后台运行的进程放到前台运行

3、进程的创建和结束 

3.1 子进程创建

3.1.1 子进程概念

子进程为由另外一个进程(对应称之为父进程)所创建的进程。

3.1.2 子进程创建-fork

#include  <unistd.h>

pid_t  fork(void);
  • 创建新的进程,失败时返回-1;
  • 成功时父进程返回子进程的进程号,子进程返回0;
  • 通过fork的返回值区分父进程和子进程。

3.1.3 父子进程 

  • 子进程继承了父进程的内容
  • 父子进程有独立的地址空间,互不影响
  • 若父进程先结束

        -子进程成为孤儿进程,被init进程收养

        -子进程变成后台进程​​​​​​​

  • 若子进程先结束

        -父进程如果没有及时回收,子进程变成僵尸进程

3.2 进程结束

#include <stdlib.h> 
#include  <unistd.h>

void  exit(int  status);
void  _exit(int  status);
void  _Exit(int  status);
  • 结束当前的进程并将status返回
  • exit结束进程时会刷新(流)缓冲区

3.3 进程回收 

3.3.1 进程回收-wait 

  • 子进程结束时由父进程回收
  • 孤儿进程由init进程回收
  • 若没有及时回收会出现僵尸进程
#include <sys/wait.h>

pid_t wait(int *status); 
  • 成功时返回回收的子进程的进程号;失败时返回EOF
  • 若子进程没有结束,父进程一直阻塞
  • 若有多个子进程,哪个先结束就先回收
  • status 指定保存子进程返回值和结束方式的地址
  • status为NULL表示直接释放子进程PCB,不接收返回值

WIFEXITED(status)

判断子进程是否正常结束

WEXITSTATUS(status)

获取子进程返回值

WIFSIGNALED(status)

判断子进程是否被信号结束

 WTERMSIG(status)

获取结束子进程的信号类型

 

3.3.2 进程回收 – waitpid 

#include  <sys/wait.h>

pid_t waitpid(pid_t pid, int *status, int option);
  • 成功时返回回收的子进程的pid或0;失败时返回EOF
  • pid可用于指定回收哪个子进程或任意子进程
  • status指定用于保存子进程返回值和结束方式的地址
  • option指定回收方式,0 或 WNOHANG

参数:

pid

  • pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
  • pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
  • pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
  • pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。

options

options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用。

  • WNOHANG :若由pid指定的子进程未发生状态改变(没有结束),则waitpid()不阻塞,立即返回0
  • WUNTRACED: 返回终止子进程信息和因信号停止的子进程信息

4、代码实验

实现进程的创建与结束

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(int argc,char** argv)
{
	pid_t pid;
	pid_t rpid;
	pid = fork();//创建子进程
	int status;
	if(pid<0)//创建失败
	{
		perror("fork");
		return 0;
	}
	else if(pid == 0)//子进程
	{
		sleep(1);
		printf("child will exit");
		exit(2);
	}
	else if(pid > 0)//主进程
	{
		rpid = wait(&status);//回收子进程
		printf("Get child status = %x\n",WEXITSTATUS(status));
	}
	while(1)
	{
		sleep(1);
	}
	return 0;
}

运行截图

5、总结

本文介绍了进程的相关概念以及相关的进程创建、结束、回收等函数,通过代码实验实现了子进程的创建与回收。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Odoo讨论+聊天模块:一体化内部协作平台,赋能高效沟通与业务流程协作

Odoo讨论聊天模块&#xff1a;一体化内部协作平台&#xff0c;赋能高效沟通与业务流程协作 Odoo 讨论模块是一个集成了即时通讯、文件共享、业务关联、权限控制等功能于一体的内部协作工具&#xff0c;允许用户通过跨模块的聊天窗口或通过专用的“讨论”面板互相发送消息、分享…

Golang(一):基础、数组、map、struct

目录 hello world 变量 常量&#xff0c;iota 函数 init函数和导包过程 指针 defer 数组和动态数组 固定长度数组 遍历数组 动态数组 len 和 cap 截取 切片的追加 map 四种声明方式 遍历map 删除 查看键是否存在 结构体 声明 作为形参 方法 封装 继承…

笔记软件功能多样的是哪款?做笔记的软件哪个好用

在快节奏的现代生活中&#xff0c;笔记软件已成为我们提高工作效率、记录生活点滴的重要工具。想象一下&#xff0c;在繁忙的工作中&#xff0c;你能够快速记录下关键信息&#xff0c;或在灵感迸发时及时捕捉&#xff0c;这是多么方便高效。 一款功能多样的笔记软件&#xff0…

Syncovery for Mac:高效文件备份和同步工具

Syncovery for Mac是一款专为Mac用户设计的文件备份和同步工具&#xff0c;凭借其高效、安全和易用的特点&#xff0c;深受用户好评。 Syncovery for Mac v10.14.2激活版下载 该软件具备强大的备份功能&#xff0c;支持多种备份方案和数据格式&#xff0c;用户可以根据需求轻松…

Python教学入门:函数

在 Python 中&#xff0c;def 关键字用于定义函数。函数是一段可重用的代码块&#xff0c;用于执行特定的任务或操作。通过定义函数&#xff0c;可以将一段代码封装起来&#xff0c;使其可以在程序中被多次调用&#xff0c;提高代码的复用性和可维护性。 下面是 def 函数定义的…

pandas/python 一个实战小案例

上次写坦克游戏的时候&#xff0c;接触了一点pandas&#xff0c;当时只是简单了解了一下如何遍历行和列并获取值来替换图片&#xff0c;想更多了解pandas。正好有一些数据需要筛选&#xff0c;试试能不能用通过代码实现。虽然总的来说不复杂&#xff0c;但由于原始数据在命名、…

如何训练猫出门不害怕:耐心做好这些训练,轻松get能溜的小猫

一般我们外出见到的都是遛狗的&#xff0c;溜猫的相对少见&#xff0c;一方面是因为猫咪是喜欢安静独处的小动物&#xff0c;另一方面是糟乱的环境也容易引起猫咪的应激。对于是否应该“溜猫”&#xff0c;有两个极端的阵营。一些铲屎官认为应尊重猫的天性&#xff0c;胆小不爱…

如何使用AI写作扩写文章?看完这篇学会扩写

如何使用AI写作扩写文章&#xff1f;在数字化时代的浪潮下&#xff0c;人工智能&#xff08;AI&#xff09;已经深入渗透到我们生活的各个领域&#xff0c;其中&#xff0c;AI写作扩写技术更是以其高效、便捷的特点受到了广大用户的青睐。它不仅极大提升了写作效率&#xff0c;…

Leetcode算法训练日记 | day29

一、递增子序列 1.题目 Leetcode&#xff1a;第 491 题 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&…

硬件?、嘉立创EDA画PCB规则设计

1、打开规则设计 设置单位为mil 点击全部 将安全距离设置为8mil&#xff0c;这个8mil是目前很多生产PCB的工厂可以做的&#xff0c;如果距离设置的更小也就是性能要求更高&#xff0c;相应的生产成本也高元件到元件的距离设置为20mil 2、设置导线的宽度规则&#xff0c;可以对v…

第G6周:CycleGAN实践

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、CycleGAN原理 &#xff08;一&#xff09;CycleGAN的原理结构&#xff1a; CycleGAN&#xff08;循环生成对抗网络&#xff09;是一种生成对抗网络&…

思维导图软件Xmind for Mac 中文激活版 支持M

XMind是一款非常受欢迎的思维导图软件&#xff0c;它应用了Eclipse RCP软件架构&#xff0c;注重易用性、高效性和稳定性&#xff0c;致力于帮助用户提高生产率。 Xmind for Mac 中文激活版下载 XMind的程序主体由一组插件构成&#xff0c;包括一个核心主程序插件、一组Eclipse…

文件后缀变成.halo? 如何恢复重要数据

.halo 勒索病毒是什么&#xff1f; .halo勒索病毒是一种恶意软件&#xff0c;属于勒索软件&#xff08;Ransomware&#xff09;的一种。这种病毒会加密用户计算机上的文件&#xff0c;并要求受害者支付赎金才能获取解密密钥&#xff0c;从而恢复被加密的文件。勒索软件通常会通…

力扣(leetcode) 42. 接雨水 (带你逐步思考)

力扣(leetcode) 42. 接雨水 &#xff08;带你逐步思考&#xff09; 链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water/ 难度&#xff1a;hard 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多…

【方便 | 重要】#LLM入门 | Agent | langchain | RAG # 3.7_代理Agent,使用langchain自带agent完成任务

大型语言模型&#xff08;LLMs&#xff09;虽强大&#xff0c;但在逻辑推理、计算和外部信息检索方面能力有限&#xff0c;不如基础计算机程序。例如&#xff0c;LLMs处理简单计算或最新事件查询时可能不准确&#xff0c;因为它们仅基于预训练数据。LangChain框架通过“代理”(…

机器学习在安全领域的应用:从大数据中识别潜在安全威胁

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Ubuntu20.04 ISAAC SIM仿真下载使用流程(4.16笔记补充)

机器&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti ubuntu20.04 安装显卡驱动版本&#xff1a;525.85.05 参考&#xff1a; What Is Isaac Sim? — Omniverse IsaacSim latest documentationIsaac sim Cache 2023.2.3 did not work_isaac cache stopped-CSDN博客 Is…

LeetCode in Python 704. Binary Search (二分查找)

二分查找是一种高效的查询方法&#xff0c;时间复杂度为O(nlogn)&#xff0c;本文给出二分查找的代码实现。 示例&#xff1a; 代码&#xff1a; class Solution:def search(self, nums, target):l, r 0, len(nums) - 1while l < r:mid (l r) // 2if nums[mid] > ta…

C++11 数据结构1 线性表的概念,线性表的顺序存储,实现,测试

一 线性表的概念 线性结构是一种最简单且常用的数据结构。 线性结构的基本特点是节点之间满足线性关系。 本章讨论的动态数组、链表、栈、队列都属于线性结构。 他们的共同之处&#xff0c;是节点中有且只有一个开始节点和终端节点。按这种关系&#xff0c;可以把它们的所有…

MC9S12A64 程序烧写方法

前言 工作需要对MC9S12A64 单片机进行程序烧写。 资料 MC9S12A64 单片机前身属于 飞思卡尔半导体&#xff0c;后来被恩智浦收购&#xff0c;现在属于NXP&#xff1b; MC9S12A64 属于16位S12系列&#xff1b;MC9S12 又叫 HCS12。 数据手册下载连接 S12D_16位微控制器 | N…
最新文章