进程控制:进程的一生

目录

进程 ID

进程的层次

进程组

会话 

进程创建之 fork

fork 之后父子进程的内存关系

fork 之后父子进程与文件的关系

文件描述符复制的内核实现

进程创建之 vfork

daemon 进程的创建

进程的终止

_exit 函数

exit 函数

return 退出

等待子进程 

僵尸进程

等待子进程 ☞ wait()

进程等待 ☞ waitpid()

等待子进程 ☞ 等待状态值

进程是正常退出的

进程收到信号导致退出

进程收到信号被停止

子进程恢复执行

进程等待 ☞ waitid()

进程退出和等待的内核实现

exec 家族

execve 函数

exec 家族

execve 函数的内核实现

exec 与信号 

执行 exec 之后进程继承的属性

system 函数

system 函数接口

system 函数与信号

总结


进程是操作系统一个核心概念。每个进程都有自己的唯一标识:进程 ID,也有自己的生命周期,一个典型的进程的生命周期如图:

进程 ID

Linux 下每个进程都会有一个非负整数表示的唯一进程 ID,简称 pid。Linux 提供了 getpid 函数来获取进程 pid,同时还提供了 getppid 函数来获取父进程的 pid,这两个函数的接口如下:

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);
pid_t getppid(void);

每个进程都有自己的父进程,父进程又会有自己的父进程,最终都会追溯到 1 号进程,即 init 进程。这就决定了操作系统上所有的进程必然会组成树状结构,就像一个家族的家谱一样。可以通过 pstree 命令来查看进程的家族树:

procfs 文件系统会在 /proc 下为每个进程创建一个目录,名字是该进程的 pid。目录下有很多文件,用于记录进程的运行情况和统计信息等:

因为进程有创建,也有终止,所以 /proc/ 下记录的目录(以及目录中的内容)也会发生变化。

操作系统必须保证在任意时刻都不能出现两个进程有相同 pid 的情况。虽然进程的 ID 是唯一的,但是进程 ID 可以重用。进程退出后,其进程 ID 还可以再次分配给其它的进程使用。那么问题来了,内核是如何分配进程 ID 的?

 Linux 分配进程 ID 的算法不同于给进程分配文件描述符的最小可用算法,它采用了延迟重用的算法,即分配给新创建进程的 ID 经量不与最近终止进程的 ID 重复&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值