Linux进程控制(上)

简介: Linux进程控制

fork函数

fork函数是创建一个子进程,之前用过。

#include <unistd.h>
pid_t fork(void);

返回值:自进程中返回0,父进程返回子进程id,出错返回-1。

进程拥有独立性,fork之后就变成了两个程序,父子进程共享后边的代码。

那么为什么给父进程返回的就是子进程的pid,而给子进程返回的就是0呢?

就好比孩子只能有一个亲生的父亲,而一个父亲可以拥有很多亲生孩子,每个孩子都是独立不同的。

fork函数是在什么时候创建的子进程呢?

pid_t fork()
{
  1.创建PCB
  2.赋值
  3.创建进程地址空间
  4.赋值
  5.创建并设置页表
  6.子进程放入进程队列//这里才是创建成功一个进程,也是分流的地方
  7.........
  return pid;//返回的时候核心代码已经执行完毕了
}

也就是说fork返回两个值是因为返回之前就已经创建好新进程了。

返回的本质就是写入,谁先返回谁先写入id,因为进程的独立性,然后就会发生写时拷贝。

fork失败的原因

系统拥有太多个进程超过了用户进程的限制就会失败。

进程终止

退出码

在写C/C++的时候,我们在main函数是程序的开始,但是最后一个位置会写return 0;

这也就代表一个程序的退出,至于为什么要写return 0,而不是返回其他的,亦或者是不写都可以,因为返回uid这个数字是退出码,0是正常退出的意思,因为正确只有一个,不会管你怎么成功,但是失败就会找失败的原因再去改正。

echo $?是查看最近进程的退出码,上一个写的进程退出码是1,再查一次就是echo $?的退出码,是0.

退出码可以自定义,也可以使用系统的映射关系,这里不太推荐。

这个之前用过:

然后来看看里面数字对应的错误信息

注意:如果程序异常退出码也无意义。

常见的退出方式

上面说了在mian函数中调用return就是进程退出。

C语言和操作系统还提供了两个函数退出进程:

这是C语言提供的一个函数,只要使用就会退出当前进程,参数是退出码。

无论是在哪个位置,或者是后面有多少代码。

还有一个系统级别调用的是_exit,作用几乎相同:

系统调用的并没有打印。

这是C语言提供的,过了两秒钟就打印出来了。

这说明:

exit 终止进程后会主动刷新缓冲区。

_exit 终止之后不会主动刷新缓冲区。

那么这个缓冲区在哪里呢?

exit会刷新缓冲区,但是系统不会,也就是说位置在系统调用和库函数之间,具体的以后说。

进程等待

什么是进程等待,为什么要进程等待

之前说过僵尸进程会导致内存泄漏,因为他的资源无法回收,所以就需要等待子进程结束然后来保存资源给父进程,通过获取子进程退出信息知道是否成功退出。

首先来看两个等待进程的函数。

wait/waitpid:

status参数是拿该进程的退出结果。

options参数是传入阻塞和非阻塞状态。

pid_t是返回进程的pid,返回-1代表失败。

wait

这个程序10-15秒是僵尸进程,15s之后就会被回收,这个时候子进程就不是僵尸状态了。

waitpid

在举例之前首先说一下status:

一个程序终止有三种情况,代码运行完毕,结果正确和不正确,还有没运行完,出异常了。

这个时候status是获取他们这个信息的,并且它是拥有自己的位图结构的。

一共有32个比特位,其中重要的只有16个比特位:

终止信号是一个进程出异常了会受到终止信号,暂时用来判断进程是否正常退出。

退出状态是看结果是否正确。

这个是等待的过程,其实就是status去PCB找信号和退出码。

总结来说:status让操作系统释放掉僵尸状态,然后获取进程的退出结果。

但是如果让我们自己去求信号和退出码很麻烦,所以Linux提供了一些操作的宏,重点说两个:

WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)

WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

相关文章
|
9月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
11月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
343 32
|
7月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
279 67
|
6月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
188 16
|
6月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
135 20
|
5月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
119 0
|
5月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
169 0
|
5月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
118 0
|
5月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
139 0
|
9月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
384 34