linux进程控制(1)-进程退出、进程等待和程序替换

进程退出

进程的推出有三种方法:
①在main函数中的return。—推出前刷新缓冲区(在任意一个不是main函数的其它函数中的return不能让进程推出,它只会推出相应的函数)
②库函数:exit()。—推出前刷新缓冲区
③系统调用函数:_exit()。—直接释放资源,不会刷新缓冲区。

进程推出场景分为:异常推出和正常退出,正常退出又可以分为能完成目标和不能完成目标。

系统调用原因获取接口:perror(),strerror(errno)。

进程等待

进程等待可以有效地避免僵尸进程的生成,它可以获取退出子进程返回值,释放子进程资源。说到进程等待,就需要了解两个函数,一个是wait,另一个是waitpid。
1、wait
wait这个接口是一个阻塞函数,如果子进程没有推出则一直等待。

pid_t wait(int *status);//处理任意一个子进程的退出

返回值:pid_t,如果子进程推出成功就返回子进程的pid,失败返回-1。
参数:status,用于获取子进程退出返回值。
2、waitpid

pid_t waitpid(pid_t pid,int* status,int options);
//可以等待任意一个子进程退出,也可以等待一个指定的子进程推出
//可以是默认阻塞接口,也可以设置为非阻塞

第一个参数:pid,-1表示等待任意一个子进程;>0表示等待指定子进程
第二个参数:status,用于获取返回值。
第三个参数options,0表示默认阻塞等待;WNOHANG-设置为非阻塞,一般情况下非阻塞和一起循环使用。
返回值:pid_t,大于0时是推出子进程的pid;等于0表示没有子进程退出;错误返回-1。
小知识点:
阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则一直等待。
非阻塞:为了完成一个 功能,发起调用,若当前并不具备完成条件,则报错返回。

进程替换

概念:替换一个进程正在调度运行的程序。加载一个新的程序到内存中,更新当前进程的页表映射信息,让当前进程映射到新的程序上。执行完新的程序之后就退出,不再回到以前的旧程序中。
下图就是在main执行的过程中,将进程替换为ls,那么页表映射就会发生改变,映射到ls进程中,ls进程执行完了,就直接退出了。
在这里插入图片描述
下面介绍exec函数族,它们都是可以实现进程替换的接口:

int execl(const char *path,const char *arg,...);
int execlp(const char *file,const char *arg,...);
int execle(const char *path,const char *arg,..,char *const envp[]);

int execv(const char *path,const char *arg[]);
int execvp(const char *file,const char *arg[]);
int execve(const char *path,const char *arg[],char *const envp[]);

第一个参数:新的程序文件路径名
第二个参数:程序的运行参数
第三个参数:程序的环境变量

函数名末尾有没有p的区别:在于程序文件是否需要带路径;
有p时,可以不用带路径,限制-程序必须在PATH环境变量指定的路径下。
有没有e的区别:在于程序是否自己设定环境变量,有e就是自己设定(覆盖式),没有e则使用默认已有的。
l和v的区别:在于程序运行参数的赋予方式不同,l是赋予一个个的字符串,v是赋予一个指针数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值