进程控制原语

本文介绍了UNIX系统下进程控制的关键原语,包括fork用于创建子进程,exec用于执行新程序,exit用于进程终止,以及wait和waitpid用于处理进程终止。在UNIX中,fork创建的子进程是父进程的副本,但拥有独立的数据空间。exec函数允许替换当前进程执行新程序,而exit确保进程资源得到正确清理。wait和waitpid则提供了处理子进程终止的方法,防止僵死进程的出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       UNIX下的进程控制原语用于控制进程的创建、执行、终止等。其基本原语如下:

       fork创建新进程,用exec执行新的程序,exit函数和两个wait函数处理终止和等待终止。下面分别讲解一下:

       除了交换进程(swapper)、init进程和精灵进程(daemon)外,一个现存进程调用fork函数是UNIX内核创建一个新进程的唯一方法。由fork创建的新进程被称为子进程( child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。子进程是父进程的复制品。例如,子进程获得父进程数据空间、堆和栈的拷贝。注意,是拷贝,不是共享(可共享的TEXT段除外)。一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。fork的典型用法为:1) 一个父进程希望复制自己,使父、子进程同时执行不同的代码段;2) 一个进程要执行一个不同的程序。在这种情况下,子进程在从fork返回后立即调用exec

       对于exit,以前有过说明,这里再补充一点。如果父进程在子进程之前终止,则对于其父进程已经终止的所有进程,它们的父进程都改变为init进程。一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程。要解决僵死进程的问题,可以fork两次,父->->孙,中间让子进程exit,这样孙进程的父进程就变为init了,而init被编写成只要有一个子进程终止,init就会调用一个wait函数取得其终止状态并处理善后,从而防止了在系统中有很多僵死进程。

       waitwaitpid都用于处理进程终止的。二者有一定区别,在一个子进程终止前,wait使其调用者阻塞,而waitpid有一选择项,可使调用者不阻塞。并且waitpid还有一些可控制的选项(详情请查书)。关于二者还有一些宏可用。

       exec函数有六种,统称为exec。当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈。

      

       具体对于进程的控制,还有很多细节的地方,比如参数的传入,环境变量的使用,父、子进程的同步等等,太多了也记不住,用到的时候再说,先大概了解一个流程吧,偷个懒J

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值