进程控制

本文详细介绍了Linux中进程的创建,包括fork()和vfork()函数的使用,以及进程终止、等待和程序替换的概念。讨论了进程创建时的数据共享与独立性,vfork()函数的阻塞特性,以及进程如何正常或异常退出。同时,重点阐述了exec函数族在程序替换中的作用,分析了各函数之间的区别和应用场景。
摘要由CSDN通过智能技术生成

进程创建

fork()

创建一个进程的流程:

首先要创建一个pcb,使用fork()函数,fork()函数中会调用clone()函数,来复制父进程中的信息。这里是采用的写实拷贝技术(实现代码共享,数据独有)。子进程会复制父进程的pcb、虚拟地址空间、页表,但是在子进程要修改数据时会给子进程申请新的物理地址来存放修改的数据,这样就实现了数据独有。各个进程之间独立性。

vfork()

创建子进程步骤:

1.调用clone
2.创建pcb
3.复制父进程
子进程和父进程共用同一个虚拟地址空间(共用虚拟地址空间会造成调用栈混乱)。
vfork()是一个阻塞函数,父进程创建子进程后,这个vfork()函数在父进程中并不会立即返回,会阻塞知道子进程exit()退出或者程序替换,才会返回(意味着父进程直到子进程退出或程序替换之后才会运行)。

进程终止

退出一个进程。

异常退出:程序运行过程中异常崩溃,程序没有运行完毕。
正常退出:程序运行完毕。

如何终止一个进程:

return
exit(int status)—库函数
_exit(int status)–系统调用接口,退出时不会刷新缓冲区

进程等待

等待一个子进程的退出,获取退出子进程的返回值,并且释放子进程资源,防止出现僵尸进程。

pid_t wait(int *status);阻塞等待任意一个子进程退出,将返回值放到status中,返回退出子进程的pid。
pid_t waitpid(pid_t pid,int *status,int options);等待指定子进程>0/任意一个子进程-1退出,返回值放到status中,options为0时,则函数默认阻塞,options为WNOHANG时,则设置为非阻塞。返回值:-1表示出错,==0表示没有子进程退出,>0表示退出的子进程pid.
阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则等待,直到条件具备完成功能后调用返回。
非阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则立即报错返回。
阻塞和非阻塞的区别:调用是否立即返回。
通常非阻塞需要循环操作。

函数应用代码展示:

    #include<stdio.h>
    #
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值