Linux进程控制

这篇具有很好参考价值的文章主要介绍了Linux进程控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

fork创建子进程,OS做了什么

进程 = 内核数据结构 + 代码和数据

创建进程首先要创建私有的内核数据结构,并将程序的代码和数据加载到内存中。

因为代码的只读属性,所以可以与父进程共享。但是数据是可修改的,所以必须分离。同时为了保证高效使用内存,所以只读数据父子进程共享一份,可修改的数据只有在被修改时才会开辟独立的变量空间(写时拷贝)来保证进程的独立性。

Linux进程控制,Linux,linux,java,运维

子进程能看到fork之前的代码,为什么只能在fork之后的语句开始执行

进程随时可能会被中断,下次回来时需要从之前的位置继续向下执行,所以CPU会记录下一条指令的地址 (EIP)。fork之后的子进程是可以看到所有的代码的,但是因为子进程的EIP起始值就是fork之后的代码,所以只能从fork之后的代码开始执行。

进程终止

进程终止OS做了什么

释放进程申请的相关内核数据结构和对应的数据和代码,本质就是释放系统资源

进程终止的常见方式

  • 代码跑完,结果正确
  • 代码跑完,结构不正确
  • 代码没有跑完,程序崩溃

main函数的返回值:

main函数的返回值就是程序的退出码,返回给上级进程,用来评判进程的运行结果(可以忽略)。

echo $? 	# 查看在最近一次进程的退出码

进程的退出码有很多种,其中0表示成功,非0表示失败。每个退出码对应这不同的失败原因。可以通过strerror来查看对应错误码的描述

Linux进程控制,Linux,linux,java,运维

但是程序崩溃时,进程退出码没有意义,因为main函数的return语句没有被执行。

如何终止进程

  1. main函数返回
  2. exit或_exit函数终止进程

C语言函数:

Linux进程控制,Linux,linux,java,运维

系统调用接口:

Linux进程控制,Linux,linux,java,运维

两者的区别:

Linux进程控制,Linux,linux,java,运维

可以说明缓冲区是语言层面给我们维护的,如果是OS维护的,那么系统调用接口_exit也会刷新缓冲区。

进程等待

为什么要进行进程等待

  1. 防止僵尸进程,造成内存泄漏

子进程退出,父进程不管子进程,子进程就要处于僵尸状态。

  1. 父进程需要回收子进程退出信息,回收子进程资源

如何进程等待

Linux进程控制,Linux,linux,java,运维

wait(NULL) = waitpid(-1, NULL, 0)

其中status并不是整体使用,而是通过比特位的方式进行划分,我们只需要关心低16位:

Linux进程控制,Linux,linux,java,运维

中间的core dump标志位表示是否发生了核心转储:

其中次低8位表示子进程的退出码,所以可以通过位运算来获取子进程的退出码:

WEXITSTATUS(status)  	# 获取子进程的退出码,如果被信号所杀值为0
status >> 8 & 0xFF 		# WEXITSTATUS的原理

低7位表示子进程收到的信号,同样可以通过位运算来获取(可以用来判断子进程是否正常退出):

WIFEXIT(status) 	# 判断子进程是否正常退出,如果子进程正常退出为0
status & 0x7F 	 	# WIFEXIT()的工作原理

为什么不直接使用全局变量获取子进程的退出信息?

因为进程具有独立性,写入退出信息时会发生写时拷贝,父进程无法拿到,信号更是如此

进程具有独立性,wait和waitpid如何拿到子进程的退出信息

僵尸进程还是会保留进程的PCB信息,task_struct中保留了子进程退出时的退出结果信息,进程等待的本质就是读取子进程的task_struct结构。
因为这两个函数是系统调用,所以有权利访问task_struct

进程替换

概念

进程替换:通过特定的接口,加载磁盘上一个全新的程序(代码和数据)到调用进程的地址空间中,替换调用进程

为什么要进程替换

在多执行流时,有时候需要子进程执行新的程序。

怎么做到的(原理)

PCB和虚拟地址基本不变,将新程序的代码和数据加载到内存中,并和当前进程的页表重新建立映射

但是并没有创建新的进程,因为PCB结构体没有发生变化,只是页表的映射关系发生了变化。

Linux进程控制,Linux,linux,java,运维

子进程进行替换时,代码和数据的替换也是一种写入,所以会发生写时拷贝,将代码与数据跟父进程彻底分离。

如何进程替换

通过系统调用exec函数实现:

Linux进程控制,Linux,linux,java,运维

这些函数如果调用成功会将当前进程的所有代码和数据进行替换,后续的代码也就不可执行。如果调用出错则返回-1,所以这些函数只有出错的返回值,没有成功的返回值

命名解释:

Linux进程控制,Linux,linux,java,运维

示例:

# execl:命令行参数使用列表的形式传参
execl("/usr/bin/ls", "ls", "--color=auto", "-l", NULL);

# execv:命令行参数使用数组的形式传参
char *const argv[NUM] = { "ls", "--color=auto", "-l", NULL};
execv("/usr/bin/ls", argv);

# execlp:自动搜索PATH变量,命令行参数使用列表的形式传参
execlp("ls", "ls", "--color=auto", "-l", NULL);

# execv:自动搜索PATH变量,命令行参数使用数组的形式传参
char *const argv[NUM] = { "ls", "--color=auto", "-l", NULL};
execv("ls", argv);

# execle:命令行参数使用列表的形式传参,同时可以传递环境变量
execle("/usr/bin/ls", "ls", "--color=auto", "-l", NULL, env);

但是这些函数都是C语言的库函数,在底层都是调用系统调用接口execve

Linux进程控制,Linux,linux,java,运维
使用方法与上面的库函数类似,只是参数的形式不同

Linux进程控制,Linux,linux,java,运维文章来源地址https://www.toymoban.com/news/detail-555915.html

到了这里,关于Linux进程控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】Linux进程控制及程序替换

    🍎 作者: 阿润菜菜 📖 专栏: Linux系统编程 在linux中fork是一个很重要的函数,它可以已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 fork函数返回两个值,一个是子进程的进程号(pid),另一个是0。 父进程可以通过pid来区分自己和子进程,子进程可

    2024年02月02日
    浏览(30)
  • 【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    柴犬: 你好啊,屏幕前的大帅哥or大美女,和我一起享受美好的今天叭😃😃😃 1. 在调用fork函数之后, 当执行的程序代码转移到内核中的fork代码后 ,内核需要分配 新的内存块 和 内核数据结构 给子进程, 内核数据结构包括PCB、mm_struct和页表,然后构建起映射关系 ,同时

    2024年01月16日
    浏览(45)
  • 【Linux进程控制】进程创建 | 进程终止 | 进程等待 | 进程替换

    【写在前面】 本文主要学习理解 fork 的返回值、写时拷贝的工作细节、为什么要存在写时拷贝;进程退出码、进程退出的场景及常见的退出方法、对比 man 2 _exit 和 man 3 exit;进程终止、操作系统怎么进行释放资源、池的概念;进程等待的价值、进程等待的方法 wait 和 waitpid

    2023年04月08日
    浏览(29)
  • linux入门之进程控制(上)进程创建,进程等待

    目录 一、进程创建 1.fork函数 2.fork函数返回值 3.写时拷贝 4.fork常规用法 5.fork调用失败原因 二、进程终止 1.进程退出场景 2.进程常见退出方法 2.1_exit函数(直接调用内核) 2.2 exit函数 2.3return退出 三、进程等待 1.进程等待必要性 2.进程等待方法 2.1 wait方法 2.2 waitpid方法 2.3获取

    2024年02月12日
    浏览(43)
  • Linux--进程控制(2)--进程的程序替换(夺舍)

    目录 进程的程序替换 0.相关函数 1.先看现象  2.解释原理 3.将代码改成多进程版  4.使用其它的替换函数,并且认识函数参数的含义 5.其它  关于进程替换我们需要了解的6个函数: 函数解释: 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。 如果调用出

    2024年04月29日
    浏览(25)
  • Linux-进程控制

    文章目录: 进程控制     为什么要有地址空间和页表     程序的内存       程序申请内存使用问题     写时拷贝与缺页中断       父子进程代码共享       为什么需要写时拷贝       页表的权限位       缺页中断     

    2024年04月08日
    浏览(16)
  • Linux进程控制

    进程 = 内核数据结构 + 代码和数据 创建进程首先要创建私有的内核数据结构,并将程序的代码和数据加载到内存中。 因为 代码的只读属性,所以可以与父进程共享 。但是数据是可修改的,所以必须分离。同时为了保证高效使用内存,所以 只读数据父子进程共享一份 ,可修

    2024年02月15日
    浏览(9)
  • 深剖 Linux 进程控制

    小编是双非本科大一菜鸟不赘述,欢迎大佬指点江山,QQ - 1319365055 🎉🎉非科班转码社区诚邀您入驻🎉🎉 小伙伴们,打码路上一路向北,彼岸之前皆是疾苦 一个人的单打独斗不如一群人的砥砺前行 诚邀各位有志之士加入!! 直达: 社区链接点我 我们说进程调用 fork ,当

    2024年01月21日
    浏览(14)
  • 【Linux系统:进程控制】

    目录 1 进程创建 1.1 fork函数 1.2 写时拷贝 1.3 fork常规用法 1.4 fork调用失败的原因  2 进程终止 2.1 进程退出场景 2.2 进程常见退出方法  3 进程等待 3.1 进程等待必要性  3.2 进程等待的方法 3.2.1 wait方法 3.2.2 waitpid方法  3.3 获取子进程status 4 进程程序替换 4.1 替换原理 4.2 替换函数

    2023年04月09日
    浏览(26)
  • Linux下进程控制

    fork函数 返回值:子进程中返回0,父进程返回子进程id,出错返回-1。 进程调用fork,当控制转移到内核中,内核做: 分配新的内存块和内核数据结构给子进程 将父进程的部分数据结构内容拷贝给子进程 将子进程添加到系统进程列表当中 fork返回,调度器开始调度 上面程序运

    2024年01月16日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包