Linux进程控制

本文围绕Linux进程展开,介绍了进程创建的fork和vfork函数,前者父子进程代码共享、数据写时拷贝,后者子父进程共享地址空间且子进程先运行;阐述了进程终止的正常与异常情况及exit和_exit的区别;说明了进程等待的作用及wait和waitpid方法;还提及通过exec函数族进行进程程序替换。

1 进程创建

1.fork函数

fork从已存在的进程中创建一个新进程,新进程为子进程,原进程为父进程。
fork返回值:
在fork返回时,新进程已经创建完毕,子进程返回0,父进程返回子进程的pid

在执行fork时,内核做了以下几件事:
1.分配新的内存块和pcb给子进程
2.复制父进程的部分pcb内容给子进程
3.将子进程添加到系统进程列表中
4.fork返回,开始调度器调度

fork后,父子进程代码共享,数据写时拷贝

fork失败的原因:
1.系统中有太多进程
2.用户的进程数超过了限制

2. vfork函数

vfork也是用于创建子进程,但是与fork不同的是:
1.vfork创建的子进程和父进程共享地址空间
2.vfork保证子进程先运行

进程终止

正常终止
1.从main函数返回
2.调用exit或_exit
异常终止
1.信号终止

exit与_exit的区别

_exit:直接退出
exit:
1.执行用户定义的清理函数
2.冲刷缓冲区,关闭所有打开的流
3.调用_exit

进程等待

作用:父进程通过进程等待的方式,回收子进程资源,获取子进程的退出信息

进程等待的方法
1.wait

pid_t wait(int* status);
任意一个子进程退出,wait都会返回,返回值为退出子进程的pid,参数为进程退出的状态,可以设置为NULL

2.waitpid

pid_t waitpid(pid_t pid,int* status,int options);

当参数pid=-1时,waitpid等同于wait,等待任意一个子进程
当参数pid>0时,waitpid等待进程ID为pid的子进程返回

可以通过设置options为WNOHANG将waitpid设置为非阻塞式等待

进程程序替换

大部分情况下,我们创建子进程是为了让它执行其他程序,而不是把父进程的程序多执行一次,可以通过exec函数族来进行程序替换

当进程调用exec函数时,进程的用户空间代码和数据完全被新程序替换,从新程序的入口开始执行,exec程序的进程id仍旧是原子进程的pid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值