fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序,当进程调用一种 exec 函数时,该进程执行的程序完全替换为新程序,而新程序则从其 main 函数开始执行,但是 exec 函数并不创建新进程,因此调用前后的进程 ID 并不发生改变,exec 只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段

有6种不同的 exec 函数可供使用:

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, char *const envp[] */ );

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

int execlp (const char *filename, const char *arg0, ... /* (char *)0 */ );

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

六个函数都定义于  头文件中,若出错返回-1,若成功则没有返回值

存放在硬盘上的可执行程序文件被执行的唯一方法就是由一个现有进程调用上述六个 exec 函数中的某一个

六个函数的区别在于前四个以路径名作为参数,后两个以文件名为参数,如果 filename 中包含 /,则将其视为路径名,否则在 PATH 环境变量所指示的目录中搜寻相应的可执行文件,filename 所指示的文件也可以是一个 shell 脚本,系统会调用 /bin/sh 执行他

六个函数中有 l 的表示 list,即使用参数列表传递所有的参数,以空指针结束,但是需要注意的是,最后的空指针如果以0为参数,则必须进行强制转换,否则会被编译器认为是常数0而不是用来标志列表结束的空指针,而函数中有 v 的表示 vector 即使用二维字符数组传递所有的参数

以 e 结尾的两个函数可以传递一个指向环境字符串指针数组的指针,其他四个函数则使用调用进程中的 environ 变量为新程序复制现有的环境变量,如果系统支持 setenv 和 putenv 则可以更改当前环境和后面生成的子进程的环境,但是不能影响父进程的环境

下图展示了六个函数之间的区别:

执行新程序的进程保持了原进程的下列特征:进程ID和父进程ID

实际用户ID和组用户ID

附加组用户ID

进程组ID

会话ID

控制终端

闹钟尚余留时间

当前工作目录

根目录

文件模式创建屏蔽字

文件锁

进程信号屏蔽

未处理的信号

资源限制

tms_utime、tms_stime、tms_cutime以及tms_cstime等值

对打开文件的处理与每个描述符的执行时关闭(close-on-exec)标志值有关,进程中每个打开描述符都有一个执行时关闭标志(FD_CLOEXEC),若此标志设置,则在执行 exec 时关闭描述符,否则该描述符仍然打开,系统默认操作是在执行 exec 后仍保持该描述符打开,但是我们可以通过使用 fcntl 函数设置该描述符,具体可以参见:

在执行 exec 后,实际用户ID和实际组ID都保持不变,但是有效ID是否改变则取决于所执行程序文件的设置用户ID和设置组ID位是否设置,如果新程序的设置用户ID位已经设置,则有效用户ID编程程序文件所有者ID,否则有效用户ID不变,对组ID的处理方式与此相同

6个函数中只有 execve 函数是系统调用,其他函数只是库函数,他们的调用关系如下图所示:

微信公众号

c语言中Exec函数,子进程的执行 -- exec 函数相关推荐

  1. c语言中math的库函数,C语言中math.h库中的常用函数

    C语言中math.h库中的常用函数 int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fa ...

  2. c语言中getenv的作用,C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数和getenv()函数的使用详解 C语言putenv()函数:改变或增加环境变量头文件: #include4 定义函数: int putenv(const char * st ...

  3. c语言include math.h,在C语言中,若需调用数学类库函数第数据进行处理,则需包含头文件______. 答案:math.h;#includemath.h;math.h;“math....

    相关问题 设随机变量X的密度函数为,则c= .e339fd828a3e5af974ac21fd9ebc7f0b.gif 有函数f(x,y,z),其中x∈[1900,2100],y∈[1,12],z∈[ ...

  4. c语言中gets与fgets,gets和fgets函数及其区别,C语言gets和fgets函数详解

    每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 finger 后台程序中使用一个 gets 调用作为它的攻击方式之一. ...

  5. java调用js匿名函数参数,JavaScript匿名函数、自执行匿名函数

    1. 函数也是一种类型 要理解匿名函数,首先需要理解函数也是一种类型. 所以函数可以赋值给变量,如下: // 将数字类型值赋给变量 var num = 1; // 将函数类型值赋给变量 var hel ...

  6. c语言中long输入字符串,C语言strtol函数

    C语言strtol函数教程 在 strtol函数详解 语法 long int strtol(const char *str, char **endptr, int base); 参数 参数 描述 st ...

  7. c语言中fflushstdin作用,C语言fflush(stdin)函数是什么意思,在什么情况下用它

    C语言fflush(stdin)函数是什么意思,在什么情况下用它 來源:互聯網  2009-04-22 18:49:31  評論 分類: 電腦/網絡 >> 程序設計 >> 其他 ...

  8. 一个函数里两个setjmp_C语言中setjmp.h的longjmp()函数

    一个函数里两个setjmp We can call this function as an advance version of goto statement but with more dynami ...

  9. c语言rewind函数作用,C语言中的setlinebuf()、utmpname()、rewind函数使用

    C语言setlinebuf()函数:设置文件流为线性缓冲区头文件: #include 定义函数: void setlinebuf(FILE * stream); 函数说明:setlinebuf()用来 ...

  10. python语言中find是什么意思_Python find()函数是什么?

    碰到去检索字符串的情况,罗列自己所学的函数,虽然能够实现,但是不是多多少少,感觉有些冗杂,不是特别简单,如果有这样的疑问,首先恭喜,大家思考能力很好,其次就是给大家带来解决疑难问题的方案,这里专门介绍 ...

最新文章

  1. 利用现有资源快速实现汉语专用分词系统
  2. 视频台词现在不用背也不用配,连对口型都免了
  3. SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
  4. 前端学习(2964):路由的实现
  5. XCode8 App上传AppStore更新
  6. CVE-2013-4547 文件名逻辑漏洞
  7. sql 列求和_图解面试题:累计求和问题如何分析?
  8. Linux学习-Jenkins安装
  9. Atitit 解决Unhandled event loop exception错误的办法
  10. 华为云服务器搭建PaddlePaddle GPU环境
  11. 【数据结构试验】树的基本操作
  12. 平行坐标图:高维数据可视化必备图形
  13. 高中计算机数据的基本特征,高一信息技术《信息与信息的基本特征》教案
  14. day12【Lambda,函数式接口】Lamd
  15. Unix 环境高级编程(一):开发环境
  16. MySql无法连接本地地址localhost
  17. 研究生图像处理该怎的自学_我的研究生这三年
  18. 初识ActiveMQ
  19. 34.驱动--块设备驱动
  20. 鲁大师测试软件的算法,鲁大师是如何检测内存的?检测内存的方法

热门文章

  1. Win11打不开本地组策略编辑器怎么办
  2. Linux进程管理命令之accton/lastcomm
  3. oracle中的INTERVAL函数用法
  4. rtspplayer播放器实现
  5. 浏览器被hao123劫持
  6. 计算一个整数,转换成二进制,里面有多少个1
  7. 中国机械锻压机市场发展态势与前景风险分析报告2022-2028年
  8. pycharm print 显示红色下划线
  9. dat图片 电脑端微信_写了一个电脑版微信的dat图片转换器
  10. Mac 解决终端:-bash: /Users/xxx/.profile: No such file or directory