Linux:进程终止和进程替换

一、进程终止

1.1 进程退出场景和创建退出方式

 进程退出有3种场景:代码执行完毕,结果正确;代码执行完毕,结果错误;代码异常终止!

 而进程退出的常见方式主要分为以下两大类:

正常终止
从main返回
调用exit退出
调用_exit退出
异常终止 ctrl c, 信号终止

1.2 exit 和 _exit区别

  exit 和 _exit都可以直接终止进程。但_exit是系统调用接口,而exit为函数调用,底层封装了exit。
不同的是,exit终止进程时,会刷新缓冲区,执行用户的清理函数,关闭流等操作;而_exit则是直接“粗暴”的退出进程,不做任何其他工作!!

在这里插入图片描述

二、进程程序替换

 fork()创建子进程时,子进程执行的代码和数据都是父进程的一部分。如果我们想让子进程执行全新的代码,访问全新的数据,我们可以采用一种技术 —— 程序替换!而进程替换可以将命令行参数和环境变量传递给被替换程序的main()函数参数!!

2.1 进程替换函数

 进程替换函数有6种以exec开头的函数,统称为exec函数。

 #include <unistd.h>

 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, char *const argv[]);
 int execvp(const char *file, char *const argv[]);
 int execvpe(const char *file, char *const argv[], char *const envp[]);

 而exec函数底层都封装了系统调用接口execve的疯转,以实现不同的需求!

 #include <unistd.h>

 int execve(const char *filename, char *const argv[], char *const envp[]);

2.2 函数解释及命名解释

函数解释

  1. 如果这些函数调用成功,也就意味着进程替换成功。此时重新加载新的程序,从启动代码开始执行,并且不再返回。即进程替换后,执行新程序,执行完后直接退出!!
  2. 如果进程替换函数执行失败,此时返回值设为-1。
  3. exec函数只有出错的返回值,没有成功的返回值。

命名解释

  • l(list):参数采用列表形式。
  • v(vector):参数采用数组。
  • p(path):带p表示执行程序时,OS会自带去环境变量PATH中查找路径。
  • e(env):表示自己维护环境变量。

2.3 单进程程序替换(无子进程)

2.3.1 带l函数进程替换(execl为例)

 下面我们在一段代码的开头和结尾分别输出打印相关信息,然后两段信息输出代码直接调用execl替换ls -a-l

【源代码】:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值