发布时间:2024-06-23 18:01
所谓的进程等待就是父进程等待子进程退出。父进程等待子进程退出其目的就是:
进程等待有2种方式,下面分别介绍:
等待任意一个子进程退出(只要有子进程,就会处理)。
参数列表:status(指针):获取子进程退出返回值。
返回值: pid_t分为2种情况:
(1)如果成功,返回子进程的pid
(2)如果失败,返回-1
wait接口是一个阻塞函数,所谓的阻塞就是为了完成一个功能,发起调用,若当前不具备完成条件,则一直等待。(就好比你去幼儿园接你娃,你没有接到你的娃,你就会一直等着(总不可能你等一会直接回家了))。
所谓的非阻塞就是为了完成一个功能,发起调用,若当前不具备完成条件,则报错返回。
参数列表:
Notes:对于异常信号值来说,当异常信号值为0,表示进程正常退出,若不为0表示进程异常退出。
如何获取异常退出信号值,有两种方法:
Notes:core dump文件在程序异常退出的时候,保存进程的信息和数据,方便后期的gdb。
返回值pid_t:
当返回值大于0时,表示退出子进程的pid。当返回值等于0时候,表示没有子进程退出。错误返回-1。
下面我们来看看这两个接口的代码操作:
Notes:这里直接将waitpid第三个参数设置为WNOHANG,如果options = 0的话其实和wait没什么区别。
上面这个代码运行后还会产生僵尸进程
是因为waitpid等待了任意一个子进程后直接处理了,后面的子进程得不到处理,就成为僵尸进程了。为了避免这种情况,给waitpid加一个循环即可:
status的获取:
此处获取子进程退出返回值成功后status的值为99(我不小心把结果整没了。。。有一丝尴尬)。
进程替换就是替换一个进程正在调度运行的程序。加载一个新的程序到内容中,更新当前进程的页表映射信息,让当前进程映射到程序上。
exec函数簇:
第一个参数:新的程序文件路径名字
第二个参数:程序的运行参数
第三个参数:程序的环境变量
举个例子:
我们可以看到上面代码执行结果并没有打印\"linux真tm难\"是因为执行execl替换以后就执行ls命令,执行完毕后就直接退出,所以没有打印\"linux真tm难\"
函数簇中,execl和execlp的区别就在于程序文件是否需要路径,有p的时候,可以不用带路径,但是有一个限制就是程序必须在PATH环境变量指定的路径下。
execle和execl的区别就在于:
程序是否自己设定环境变量,有e就是自己设定(覆盖式),没有e就是用默认的路径。
我们可以看到当使用execle时,环境变量就剩一个了,就是我们自己设置的。
execl和execv的区别就在:
程序运行参数的赋予方式不一样,v是传字符串指针数组。