进程等待和进程替换

终止进程

进程退出场景
  1. 代码运行完毕,结果正确退出
  2. 代码运行完毕,结果错误退出
  3. 代码异常终止
进程退出

1.正常退出
从main中return中退出;
调用void exit(int status)和 void _exit(int status) ,exit在任意位置调用都可以终止程序。

两者区别:
这里写图片描述

进程等待—–避免产生僵尸进程

僵尸进程的产生是因为子进程先行退出,父进程没有关心子进程的退出状态,一旦产生僵尸进程,kill -9 也不能杀死,并且我们也需要知道子进程执行任务的情况,是对是错,还是异常,通过父进程等待的方式,我们可以了解情况,而且父进程回收子进程资源,获取子进程的退出信息,来避免产生僵尸进程。

以下是等待进程的两个接口:

父进程调用wait获取子进程的退出状态

pid_t wait(int *status)

等待任意子进程的退出

对参数的理解:
参数statue所指空间存放子进程的退出状态,不关心子进程是是什么原因退出的,可以设置为NULL;
等待任意子进程的退出,父进程被阻塞,如果没有子进程推迟,就一直等待,直到子进程退出,所以这种等待方式是阻塞式的;
等待成功,返回被等待的子进程的pid,等待失败,返回-1

对阻塞的理解:
这里写图片描述
pid_t waitpid(pid_t pid ,int *status,int options

可以等待任意子进程,也可以等待特定子进程

对参数的理解:
pid:pid = -1,功能与wait相同;pid >0时,等待其进程ID与pid相同的子进程
status:和wait的第二个参数功能是一样的。
options:如果设置为0,那么这个函数就是阻塞式等待,如果设置为WNOHANNG,就是非阻塞式等待(非阻塞式等待:父进程在等待子进程的同时也可以做其他的事情)

对参数status的详细解释

以下解释适用于wait和waitpid两个接口

int* status,是一个输出型参数,由操作系统填充,如果不关心子进程的退出状态信息,就设置为NULL,否则操作系统会根据该参数,将子进程的退出信息反馈给父进程。但它不能当做一个简单的整数来看,应当做位图来看,只看低16位比特位
这里写图片描述

关于两个宏:WIFEXTEDHE (status)和 WEXITSTATUS(status)
这两个宏对于以上两个接口都可以用
用这两个宏来检查wait和waitpid所返回子进程的退出状态;

如果WIFEXTEDHE (status)不是0,则子进程正常退出,可以利用 WEXITSTATUS(status)来查看子进程的退出码,例如子进程exit(3),那么, WEXITSTATUS(status)的值就是3。需要强调的是,WEXITSTATUS(status)只能用来查看正常退出的子进程的而退出码

如果WIFEXTEDHE (status)是0,则子进程异常退出。

进程替换

用fork创建子进程后,人们往往希望它执行和父进程不一样的程序,所以子进程
往往调用一种exec函数执行另外一个程序,本质来说要想子进程执行其他程序,就是将虚拟地址和页表里面的内容替换掉

实现进程替换的函数接口

六种exec开头的替换函数:

int  execl(const char *path,const char *arg,...)   //第一个参数是要替换的程序的路径(即要替换的程序在哪里),接下来的参数都平铺(一般用于linux指令),   ...代表不定参数
int execv(const char *path,char *const argv[])   //char *const argv[]参数为指针数组
//两者区别:参数如何赋予(平铺,指针数组)

代码如下:
要替换的而程序:
这里写图片描述

替换执行代码:
这里写图片描述
结果:
这里写图片描述
后面跟p的

int execlp (const char *file,const char *arg,...)
int execvp(const char *file,char *const argv[])
//与第一组的区别就是不需要告诉操作系统的路径,只需要告诉要替换的程序名称即可,会自动到路径下找(通常用于linux指令)

后面跟e 的

int  execle(const char *path,const char *arg,...char *const envp[])  
int execve(const char *path,char *const argv[],char *const envp[])
//与第一组的区别:带e的是用户自己组织环境变量,第一组的则是继续父进程的环境变量

这些函数执行成功则开始执行新程序,不会在返回,失败返回-1

//带p的,不用跟路径
eXeclp("test","test",NULL);
execvp("test",argv);

//带e的,自己创建坏境变量
char *env[] = {"PATH = /user/bin/",  "HOME = JINFOCODMC",NULL};
execle("./test","test",NULL,env);
execve("./test",argv,env);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值