linux C编程1-exit和exec

本文介绍了程序退出的各种方法及执行新程序的相关函数,包括_exit()、_Exit()、atexit()、exit()函数的不同用途及execve()函数和exec函数族如何用于执行新程序。

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

目录

1、程序退出

1.1、_exit()函数

1.2、_Exit()函数

1.3、atexit()函数

1.4、exit()函数

2、执行新程序

2.1、execve()函数

2.2、exec函数族


1、程序退出

1.1、_exit()函数

#include <unistd.h>

void _exit(int status);

参数  status :状态标志, 0 表示正常结束、若为其它值则表示程序执行过程中检测到有错误。

1.2、_Exit()函数

_exit()和_Exit()两者等价,用法作用是一样的。

1.3、atexit()函数

atexit()库函数用于注册一个进程在正常终止时要调用的函数。exit调用这些函数的顺序与它们登记时间的顺序相反(LIFO)。同一个函数若登记多次,则也会被调用多次(最少32???)。

很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。

#include <stdlib.h>

int atexit(void (*function)(void));

参数 function: 函数指针,指向注册的函

数,此函数无需传入参数、无返回值。
返回值: 成功返回 0;失败返回非 0。

注:如果程序当中使用了_exit()或_Exit()终止进程而并非是 exit()函数,那么将不会执行注册
的终止处理函数。

1.4、exit()函数

执行一些清理工作,最后调用_exit()函数。

1)如果程序中注册了进程终止处理函数,那么会调用终止处理函数。
2)刷新 stdio 流缓冲区。
3)执行_exit()系统调用。

#include <stdlib.h>

void exit(int status);

参数  status :状态标志, 0 表示正常结束、若为其它值则表示程序执行过程中检测到有错误。

2、执行新程序

2.1、execve()函数

系统调用execve()可以将新程序加载到某一进程的内存空间,通过调用 execve()函数将一个外部的可执行文件加载到进程的内存空间运行,使用新的程序替换旧的程序。该进程完全由新程序替换,而新程序则从其 main 函数开始执行。因为调用 exec 并不创建新进程,所以前后的进程 ID (当然还有父进程号、进程组号、当前工作目录……)并未改变。

#include <unistd.h>

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

参数 filename:指向需要载入当前进程空间的新程序的路径名,既可以是绝对路径、也可以是
相对路径。
参数 argv:指定了传递给新程序的命令行参数。是一个字符串数组, 该数组对应于 main(int argc,char *argv[])函数的第二个参数 argv,且格式也与之相同,是由字符串指针所组成的数组,以 NULL 结束。argv[0]对应的便是新程序自身路径名。
参数 envp: 字符串指针数组, 指定了新程序的环境变量列表, 参数 envp 其实对应于新程序的 environ 数组,同样也是以 NULL 结束,所指向的字符串格式为 name=value。
返回值: execve 调用成功将不会返回;失败将返回-1,并设置 errno。

2.2、exec函数族

exec 函数族是一簇函数,在 Linux 中,并不存在 exec()函数,exec指的是一组函数,一共有 6 个:

#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 execve(const char *path, char *const argv[], char *const envp[]);

注:其中只有 execve()是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。

注:exec 函数族与一般的函数不同,exec 函数族中的函数执行成功后不会返回,而且,exec 函数族下面的代码执行不到。只有调用失败了,它们才会返回 -1,失败后从原程序的调用点接着往下执行。

exec 函数族的 6 个函数看起来似乎很复杂,但实际上无论是作用还是用法都非常相似,只有很微小的差别:

函数使用文件名使用路径名

使用参数表

(函数名带字幕l)

使用argv

(函数名带字幕v)

使用自定义进程环境变量

(函数名带字幕e)

execl
execlp
execle
execv
execvp
execve

 l(list):参数地址列表,以空指针结尾。

v(vector):存有各参数地址的指针数组的地址。

p(path):按 PATH 环境变量指定的目录搜索可执行文件。

e(environment):存有环境变量字符串地址的指针数组的地址。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值