进程控制(十)---exec族函数

  当使用fork()创建了一个子进程后,通常接着会使用 exec 族函数指定新的程序来覆盖子进程的代码段、数据段、堆和栈。从而让子进程去执行一个新的程序,而不是执行父进程的副本。

=====================================================

exec 族函数中总共有 6 个函数:

上面 5 个函数属于库函数,这些函数都最终调用了下面的 execve 函数,这6个函数中,只有execve 函数属于Linux的系统调用。

出错返回:

  • 这些函数在调用成功时不会返回,只有在调用出错时才返回 -1

====================================================

这几个函数的区别(通过函数名来区分):

  • 带 l 的(list):意思是命令行参数以 单独参数 形式给出
  • 带 v 的(vector):意思是命令行参数以 字符指针数组 的形式给出
  • 带 p 的(path):意思是在 PATH 环境变量中搜索给出的文件名,(当然,如果给出文件的路径名也是可以的,只给出文件名的时候会去PATH变量中去寻找)
  • 不带 p 的:意思是必须给出完整的可执行文件名
  • 带 e 的(environment):意思是给可执行文件传递新的环境变量
  • 不带 e 的:意思是不传递环境变量,使用从父进程复制而来的环境变量

=======================================================

当调用 exec 族函数来让新的程序覆盖原来进程的代码段、数据段和堆栈的时候:

  • 并不会创建新的进程,所以进程的 进程ID 和父进程ID 仍然保持不变,也就说 父子关系 是不会因为调用 exec 族函数而改变的。
  • 子进程中从父进程复制而来的文件描述符默认是不会关闭的,在新程序中仍然是可以使用的。除非调用 fcntl 函数来关闭了close-on-exec标志。
  • 打开的目录流是会关闭的,这是由于opendir函数实现的,opendir函数会打开close-on-exec标志。
  • 实际用户 ID 是不变的,有效用户ID是根据新的可执行文件来决定的,如果新的可执行文件设置了set-user-id位,那么有效用户ID将被设置成文件的用户ID,否则有效用户ID就维持原来子进程的有效用户ID不变。
时间: 2024-10-04 04:17:50

进程控制(十)---exec族函数的相关文章

进程控制(十二)---system函数

system函数是用来在进程中执行 shell 命令的.注意其实 exec 族函数其实也可以用来在进程中执行 shell 命令,但是这两个函数实现执行 shell 命令的原理是完全不同的. system函数相当于是 fork->exec->wait 这样的一个过程,也就是说system函数会调用fork函数来创建一个子进程,然后在子进程中去执行 shell命令,不影响父进程的执行. 而直接利用 exec 族函数来执行 shell命令是将 shell命令的代码段.数据段直接覆盖掉本进程原来的代码

【Linux 进程】exec族函数详解

exec族的组成: 在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

Linux学习笔记(8)-exec族函数

昨天学习了Linux下的进程创建,创建一个进程的方法极为简单,只需要调用fork函数就可以创建出一个进程,但是-- 介绍fork()函数的时候提到,在创建进程后,子进程与父进程有相同的代码空间,执行的是和父进程完全一样的代码-- 那这样的话,我辛辛苦苦创建一个进程,还有什么意义? 辛辛苦苦的养大了一个儿子,难道就是为了让他走老子的老路? 带着满心的疑惑,我又进行了下一章的学习,突然恍然大悟,原来还有一个叫exec族函数的东西,专门就是用来给新创建的进程分配工作的. 调用exec族函数并不创建进程

【转载】linux进程控制-exec系列 exec系统调用

inux进程控制-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, ...,

嵌入式 Linux进程间通信(二)——exec族函数

嵌入式 Linux进程间通信(二)--exec族函数 exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件.这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件. exec族函数包含如下函数: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int exec

替换进程映像 - exec系列函数

exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同.exec函数可以把当前进程替换为一个新进程,新进程由patch或file参数指定.你可以使用exec函数将程序的执行从一个程序切换到另一个程序.例如,你可以在启动另一个有着受限使用策略的程序前,检查用户的凭证.exec函数比system函数更有效,因为在新的程序启动后,原来的程序就不再运行了. 替换进程映像 - exec系列函数

Linux系统编程_9_进程控制之exec 函数

exec函数 当进程调用exec函数时,该进程的执行程序完全的替换为新程序.新程序从它的main函数开始执行: 使用fork函数创建一个子进程后,子进程往往会使用exec函数去执行另一个程序. 注意:调用exec函数并不会创建新进程,所以创建前后的进程ID不会改变,exec只是用一个全新的程序替换了当前正在运行的程序的代码段.数据段.堆.栈. #include <unistd.h> extern char **environ; int execl(const char *path, const

unix exec族函数 关于参数的疑惑

问题不出在这几个函数,而在于看后文解释器的时候发现一个很奇妙的问题. #include <unistd.h> int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ ); int execv(const char *pathname, char *const argv []); int execle(const char *pathname, const char *arg0, ... /* (char *)0

进程控制(十四)---进程组

在Linux系统中,每个进程都会属于一个进程组,而每个进程组都有一个进程组ID(pgid),这个进程组ID的值等于组长进程的进程ID.通常在shell下执行的第一个程序将成为一个组长进程,其后生成的所有与此进程有血缘关系的进程都属于此进程组(除非子进程使用setpgid函数改变自己的进程组ID). ======================================================= Linux系统提供了 getpgrp 函数和 getpgid 函数来读取进程的进程组 I