Linux之进程控制

[Linux] 进程控制 子进程刚被创建时,与父进程共享代码和数据,但当子进程需要进行进程程序替换时,也就意味着子进程需要对其数据和代码进行写入操作,这时便需要将父子进程共享的代码和数据进行写时拷贝,此后父子进程的代码和数据也就分离了,因此子进程进行程序替换后不会影响父进程的代码和数据。因此,对于子进程来说,父进程是不需要被标识的;进程程序替换之后,该进程对应的PCB、进程地址空间以及页表等数据结构都没有发生改变,只是进程在物理内存当中的数据和代码发生了改变,所以并没有创建新的进程,而且进程程序替换前后该进程的pid并没有改变。 阅读详情

今天分享一下关于Linux进程控制的知识点

1.进程创建

fork( )函数

#include<unistd.h>
pid_t fork(void);
通过返回值判断是否创建成功,分流父子进程
对于父进程,返回的是子进程的pid>0
对于子进程,返回的是0

创建过程:通过复制调用父进程,创建一个新的进程(子进程)。
复制的父进程的pcb,复制了父进程大部分的数据,因此代码共享,但是数据独有,所以是一种写实拷贝。
因为在父子不再写入数据时,父子的数据是共享的,但是一方试图写入的话,便用写实拷贝的方式各自一份副本。
同时在这里也提到一下vfork( )这个进程创建函数:
子进程与父进程公用同一块虚拟地址空间—子进程先运行,等到子进程exit退出或者程序替换后,父进程才开始运行,子进程return后资源释放,父进程则调用栈混乱,因此vfork创建子进程不能在main中return退出。
vfork的存在意义:
快速创建子进程,并且子进程是专门用来运行其他程序,公用地址空间可以减少子进程数据拷贝父进程的消耗,因此速度快。但是vfork逐渐被淘汰了,因为fork函数的写实拷贝技术的出现。

xshell6中vfork( )函数代码实现部分:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 
  5 int main()
  6 {
  7     int pid = vfork();
  8     if(pid==0){
  9         printf("child---%d\n",getpid());
 10     }
 11     else{
 12         printf("parents---%d\n",getpid());
 13     }
 14     return 0;
 15 
 16     while(1){
 17         printf("---%d\n",getpid());
 18         sleep(1);
 19     }
 20     return 0;
 21 }

2.进程等待

进程等待就是为了等待子进程的退出,避免产生僵尸进程!
父进程不知道子进程什么时候退出,所以忙其他事情,这时候如果子进程退出了,操作
系统的通知,父进程可能就没有关注到,子进程成为僵尸进程,僵尸进程过多的话就会导致资源泄漏,无法创建创建新的子进程,危害很大。

关于僵尸进程概念一节请参考我的另一篇博客:
https://blog.youkuaiyun.com/Python_programer/article/details/88921155

wait(int)—阻塞函数;等待任意一个子进程退出。
wait(NULL)表示不关心子进程的返回值,让操作系统直接释放子进程。
阻塞:为了完成功能发起调用,如果当前不具备完成条件,则一直等待,直到完成后返回。
非阻塞:为了完成功能发起调用,如果当前不具备完成条件,则立即报错返回。
阻塞与非阻塞的区别:调用功能当前不具备完成条件是否立即返回。
pid_t waitpid(pid_t pid,int* statu,int opt)
pid:
-1 : 等待任意子进程退出
0 :等待指定子进程退出
status :用于获取退出原因
options:
WNOHANG 将waitpid设置为非阻塞
函数返回值: -1 错误 0 子进程没有退出 >0 退出子进程的pid
可以等待任意一个子进程退出或者等待指定子进程退出,waitpid可以通过opt将操作设置为非阻塞。
获取子进程status:
status不能简单的当作整形来看待,可以当作位图来看待如下图所示,只研究status低16比特位。
在这里插入图片描述
低十六位的高八位存放子进程退出的返回值。
低十六位的低八位的高一位叫1b(core dump标志) 程序异常退出时,是否保存运行信息。
低七位为存储异常退出信号值。
如何获取子进程退出码:(statu>>8)&0xff(status为int型)。
判断程序是否正常退出:status&0x7f --异常信号值为0,证明程序是正常退出,否则异常退出。
WIFEXITED(status):判断进程是否正常退出,正常退出则返回true
WEXITSTATUS(status):在进程正常退出时,获取子进程退出码

if(WIFEXITED(status)){
printf(“退出值为 %d\n”, WEXITSTATUS(status));
}

WIFSIGNALED(status)为非0 表明进程异常终止。
若上宏为真,此时可通过WTERMSIG(status)获取使得进程退出的信号编号

if(WIFSIGNALED(status)){
printf(“使得进程终止的信号编号: %d\n”,WTERMSIG(status));
}

xshell6中waitpid()函数代码实现部分:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 
  5 int main()
  6 {
  7     int pid = fork();
  8     if(pid<0){
  9         perror("fork error!");
 10         exit(-1);
 11     }
 12     else if(pid==0){
 13         sleep(5);
 14         exit(255);
 15     }
 16 
 17     int statu;
 18     int ret;
 19     while((ret = waitpid( pid, &statu, WNOHANG))==0){
 20         printf("忙其他的事!\n");
 21         sleep(1);
 22     }
 23     if(!(statu & 0xf7)){
 24         printf("%d--%d---the child exit code:%d\n",ret,pid,
 25             (statu>>8)&0xff);
 26     }
 27     if(WIFEXITED(statu)){
 28         printf("the child exit code:%d\n",WEXITSTATUS(statu));
 29     }
 30     if(WIFSIGNALED(statu)){
 31         printf("the exit signal:%d\n",WTERMSIG(statu));
 32     }
 33     while(1){
 34         printf("-------\n");
 35         sleep(1);
 36     }
 37     return 0;
 38 }

3.进程终止

终止场景:
正常退出,结果符合预期
正常退出,结果不符合预期
异常退出
终止方式: 二者的区别要分清!
main函数中return
exit()是一个库函数,在退出前会刷新缓冲区,做退出的收尾工作
_exit()是一个系统调用接口,直接退出,释放资源
返回值:
echo $? 可以查看进程返回值
错误编号:每个系统调用执行完毕后都会重置进程中errno这么一个全局变量,这个全局变量
中存储的就是档次调用的系统调用接口错误编号,当系统调用接口出错用户就可以通过这个errno获取系统调用的错误原因。
void perror(const char* s);
char* strerror(int errnum);

xshell6中exit()函数代码实现部分:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<string.h>
  5 #include<errno.h>
  6 
  7 int main()
  8 {
  9     int pid = fork();
 10     if(pid<0){
 11        perror("fork error");
 12        printf("fork error %s\n",strerror(errno));
 13     }
 14     printf("-------");
 15     int i=0;
 16     for(;i<256;i++)
 17     {
 18         printf("%s\n",strerror(i));
 19     }
 20     sleep(3);
 21     _exit(255);
 22     exit(0);
 23     return 0;
 24 }

链路监控pinpoint3.0.3安装部署(2) 本文详细介绍了Pinpoint 3.0.3分布式链路监控系统的安装部署过程。主要内容包括:1)数据库安装(HBase、MySQL、Redis、Pinot)的详细配置步骤;2)中间件Zookeeper和Kafka的安装;3)Pinpoint三大组件的部署:Collector、Web和Batch的配置文件修改和启动脚本。文章特别强调了使用-starter-exec.jar包的重要性,并提供了各组件所需的详细参数配置,包括数据库连接、Zookeeper地址、Kafka配置等关键信息。 阅读详情

相关推荐

「0基础安装本地Hermes」本地部署Hermes|为Hermes装上UI图形界面

Hermes已经发布有一段时间了,不少小伙伴也装配上了这个Agent。相对于之前发布爆火的Openclaw,Hermes对于很多小白不是很友好,它没有属于自己的UI界面,只能在本地终端运行,前不久Github上有人发布自己的作品,让终端里的Hermes拥有属于自己的UI界面,EKKOLearnAI开发的Hermes UI界面项目为终端运行的Hermes提供了可视化操作方式,降低了使用门槛。该项目通过Web界面与本地Hermes Agent交互,实现更友好的操作体验。

qq_55438365的博客 1872

操作系统——Linux 进程控制

操作系统课设:实验二

CSH__的博客 2159

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 230

python实现Linux服务器的进程监控并暂停程序和报警

python实现对Linux服务器进程监控并自动报警,自动手动暂停或终止程序

zzh630的博客 1194

MiniOSD DIY记

最近迷上了航模,研究了很多东西,感觉路走的长了还是适当要停下脚步休息下总结下。 这次DIY的是一块OSD设备,主要用于航模图传的叠加显示,原理也很简单就是atmel atmega328p+MAX7456芯片,网上卖的成品基本上都是一个原理图。 原理图 我按照我自己的需要做了适当的更改,去掉了DC-DC电路,直接用5V输入,因为摄像头都是5V的,所以DC-DC不是很有必要,体积上更加小了点, 打...

memoff的博客 8523

制作INCA和CANape通用的A2L

CANape和INCA通用的A2L配置与修改

赞的博客 5962

【Linux】进程控制(详细解析)

有关Linux进程控制的详细解析,包括进程创建,进程退出,进程等待,进程程序替换等。

weixin_63449996的博客 2699

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

算法大师! 1599

实验报告三-Linux系统多用户管理、进程管理

解释:特殊权限SUID的作用:给passwd命令设置SUID,则每个用户执行passwd命令都会拥有和passwd命令对应的用户的权限,即以文件所有者的身份执行。2、掌握Linux系统的多用户管理命令useradd,usermod,userdel,passwd,groupadd,groupdel,gpasswd,groups,newgrp等命令;1、理解多用户管理是Linux系统非常重要的特征,理解多用户在Linux系统中是如何体现的;5、掌握Linux系统进程管理命令ps,kill等,top工具的使用。

weixin_59436900的博客 1474

机械式激光雷达实现原理以及特性总结

本文介绍了机械式激光雷达的技术原理和核心特性。该技术通过机械旋转结构实现360°三维扫描,采用飞行时间法测距并生成点云数据。核心优势包括全向扫描、长距高精度和成熟度高,但存在体积大、成本高、可靠性受限等局限。典型应用于自动驾驶测试车、测绘建模等领域。与固态激光雷达相比,机械式在视场角和探测距离方面有优势,但在体积、成本和可靠性方面处于劣势。该技术目前主要应用于对成本不敏感的专业场景。

start_up_go的博客 262

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

Linux进程控制——精讲

Linux进程控制--精讲

qq_61213622的博客 490

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux进程控制

Linux进程控制

m0_57304511的博客 1225

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Linux】进程控制

进程控制是操作系统中管理和调度进程的关键功能,涉及到进程的创建、终止、等待、程序替换以及进程间通信等多个方面,简而言之,进程控制确保操作系统能够有效地管理并协调不同程序的执行。对于我们而言,要对进程进行相关操作,就要深入理解操作系统对进程的控制机制,并熟悉Linux下进程控制的相关接口。本篇文章,我们学习了进程控制的概念及进程创建、进程终止、进程等待和进程程序替换的相关Linux常用接口,学习了这些接口,想必大家能够更好地理解和掌握Linux系统中的进程控制技术。

2301_80955819的博客 4809

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux《进程控制》

1.进程创建在之前的Linux《进程概念》当中我们已经了解了进程基本的概念,那么接下来在本篇当中我们将开始进程控制的学习;在本篇当中我们先会对之前的学习的创建子进程的系统调用fork再进行补充了解,并且再之后会重点的学习进程的终止、进程等待以及进程的替换。学习完这些知识之后再下一篇章当中就可以试着自己实现Shell,通过本篇的学习将会让你对进程有更深的理解,一起加油吧!!!1.进程创建。

mljy.博客 2717

Linux-进程控制

Linux-进程控制进程创建fork函数fork函数返回值fork常规用法fork调用失败的原因写时拷贝进程终止进程退出场景进程常见退出方法_exit函数&&exit函数&&return退出 进程创建 进程的创建: 命令行启动命令(程序、指令……) 通过程序自身,fork出来的子进程 fork函数 在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 语法: #include <unistd.h&gt

AI_ELF的博客 6716

【linux】进程控制——进程创建,进程退出,进程等待

一个进程创建了另一个进程,创建者为父进程,被创建者为子进程。父进程可以创建多个子进程。操作系统是一号进程,所有进程构成一颗多叉树结构。每个父进程只对直系的子进程负责。父进程创建子进程的一整套流程为:创建子进程——>子进程完成任务——>父进程回收子进程父进程先退,子进程未退。此时子进程的父亲进程被改为1号进程(操作系统),那么该子进程被称为孤儿进程父进程未退,子进程先退。但父进程没有读取到子进程的退出(进程等待),该子进程的状态被改为 Z 状态,Z 状态的进程被成为僵尸进程。

2301_79796701的博客 2708

Linux系统-进程控制

Linux进程控制零、前言一、进程创建1、fork函数2、fork返回值3、fork用法4、fork失败二、进程终止1、退出码2、退出方法1) 调用_exit函数2)调用exit函数3)main函数return4)异常退出3、理解终止三、进程等待1、等待方法2、获取status3、理解等待四、进程替换1、替换原理2、替换方法五、实现简易shell 零、前言 前篇我们讲解学习了关于进程的概念知识,本章主要讲解关于进程的控制,深入学习进程 一、进程创建 1、fork函数 概念: 在linux中fork

~ 2200

Linux 进程控制总结

从严格意义上来讲,程序和进程是两个不同的概念,他们的状态,占用的系统资源都是不同的。程序:就是磁盘上的可执行文件文件, 并且只占用磁盘上的空间,是一个静态的概念。进程:被执行之后的程序叫做进程,不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。

wei_Embedded_z的博客 882

linux进程及进程控制

Linux进程控制   程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例。利用分时技术,在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片,让每个进程在一个时间片内运行。当进程的时间片用完时系统就利用调度程序切换到另一个进程去运行。因此实际上对于具体单个CPU的机器来说某一个时刻只能运行一个进程。但由

辉仔 の专栏 1万+
上一篇: linux实现一个简易的minishell
下一篇: Linux里的fork,popen,system函数
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值