exec函数族

Linux中,exec函数族有6种不同的调用的形式,它们声明在<unistd.h>头文件中,6个函数如下:

#include <unistd.h>
int execve(const char *path,char* const argv[],char* const envp[]);
int execv(const char *path,char* const envp[]);
int execle(const char *path,const char *arg,...);
int execl(const char *path,const char *arg,...);
int execvp(const char *file,char* const argv[]);
int execlp(const char *file,const char *arg,...);

exec调用并没有生成新进程。一个进程一旦调用exec函数,它本身就“死亡”了,系统把代码段替换成新的程序的

代码,废弃了原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,惟一保留的就是进程ID。对系统而言,

还是同一个进程,不过执行的是另一个程序了。

为了更好的理解exec函数族的使用,需要先理解环境变量。为了便于用户灵活的使用shell,Linux引入了环境变量

的概念,包括用户的主目录、终端类型、当前目录等,它们定义了用户的工作环境,所以称为环境变量。用户可以使

用env命令查看环境变量值,用户也可以修改这些变量值以定制自己的工作环境。

下面是exec函数族的各个函数是如何将main函数需要的参数传递给它的:

  • execv函数:execv函数通过路径名方式调用可执行文件作为新的进程映像。它的argv参数用来提供给main函数的

argv参数。argv参数是一个以NULL结尾(最后一个元素必须是一个空指针)的字符串数组。

  • execve函数:在该系统调用中,参数path是将要执行的程序的路径名,参数argv、envp与main函数的argv、envp

对应。(参数argv和参数envp的大小都是受限制的。linux操作系统通过宏ARG_MAX来限制它们的大小,如果它们的容

量之和超过ARG_MAX定义的值将会发生错误。)

  • execl函数:该函数与execv函数的用法类似。只是在传递argv参数的时候,每个命令行参数都声明为一个单独的

参数(参数中使用“...”说明参数的个数是不确定的),需要注意的是这些参数是以一个空指针作为结束的。

  • execle函数:该函数与execl函数用法类似,只是要显式指定环境变量。环境变量位于命令行参数最后一个参数的

后面,也就是位于空指针之后。

  • execvp函数:该函数与execv函数用法类似,不同的是参数filename。该参数如果包含"/",就相当于路径名;如

果不包含"/",函数就到PATH环境变量定义的目录中寻找可执行文件。

  • execlp函数:该函数类似于execl函数,它们的区别和execvp与execv的区别一样。

exec函数族的6个函数中只有execve是系统调用。其它5个函数都是库函数,它们实现时都调用了execve。正常情况

下,这些函数是不会返回的,因为进程的执行映像已经被替换,没有接收返回值的地方了。如果有一个错误的事件,将

会返回-1。这些错误通常是由文件名或参数错误引起的。

exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进

程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

原文地址:https://www.cnblogs.com/XNQC1314/p/9193305.html

时间: 2024-10-17 01:51:01

exec函数族的相关文章

exec函数族,守护进程,线程同步和互斥

2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()-->子进程将./a.out后面的参数存放到argv[].然后调用exec处理这些参数,最后子进程退出,光标闪动 进程进入停止态:1,调试的时候,2,将前台变成后台运行 线程:每个程序加载到内存后可以对应创建一个或多个顺序执行流(能使进程在同一时刻做不止一件事,每个线程处理各自独立的任务) 回调函数 同步

Linux进程控制——exec函数族

原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char

Linux系统编程——进程替换:exec 函数族

在 Windows 平台下.我们能够通过双击运行可运行程序.让这个可运行程序成为一个进程:而在 Linux 平台.我们能够通过 ./ 运行,让一个可运行程序成为一个进程. 可是,假设我们本来就执行着一个程序(进程),我们怎样在这个进程内部启动一个外部程序.由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现. exec 函数族.顾名思义.就是一簇函数,在 Linux 中,并不存在 exec() 函数.exec 指的是一组函数.一共同拥有 6 个: [cpp

Linux进程实践(3) --进程终止与exec函数族

进程的几种终止方式 (1)正常退出 从main函数返回[return] 调用exit 调用_exit/_Exit (2)异常退出 调用abort   产生SIGABOUT信号 由信号终止  Ctrl+C [SIGINT] ...(并不完全, 如return/pthread_exit等) 测试[exit/_exit] //尝试查看该程序的打印输出 int main() { cout << "In main, pid = " << getpid(); //去掉了en

(转载)Linux进程控制——exec函数族

1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., cha

exec函数族实例解析

fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间.linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间.),也就是这两个进程做完全相同的事. 在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事). fork创建一个新的进程就产生了一个新的PID,e

Linux多任务编程之三:exec函数族及其基础实验(转)

来源:CSDN  作者:王文松  转自:Linux公社 exec函数族 函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈 段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了.另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执 行

linux exec函数族

fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的"副本",这意味着父子进程间不共享这些存储空间.linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间),也就是这两个进程做完全相同的事. 在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事) fork创建一个新的进程就产生一个新的PID

UNIX环境编程学习笔记(20)——进程管理之exec 函数族

lienhua342014-10-07 在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序.调用 exec 函数之后,该进程就将执行的程序替换为新的程序,而新的程序则从 main 函数开始执行. UNIX 提供了 6 种不同的 exec 函数供我们使用.它们的原型如下所示, #include <unistd.h>int execl(const char *pathname, const char *arg0, ... /* (cha