使用fork或vfork创建子进程后,子进程通常会调用exec函数来执行另外一个程序。系统调用exec用于执行一个可执行程序以代替当前进程的执行映像。

exec调用没有生成新进程。一个进程一旦调用exec函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段和堆栈段,唯一保留的就是进程ID。也就是说,对系统而言,还是同一个进程,不过执行的已经是另外一个程序了。

//文件processimage.c,用以替换进程映像的程序
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc,char *argv[],char **environ)
{int i;printf("I am a process image!\n");printf("ProcessImage:pid = %d, parentpid = %d\n", getpid(), getppid());printf("ProcessImage:uid = %d,gid = %d\n", getuid(), getgid());for(i=0; i< argc; i++)printf("argv[%d]:%s\n",i ,argv[i]);
}
//文件execve.c,使用execve()函数调用processimage
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc,char * argv[],char ** environ)
{pid_t pid;int   stat_val;printf("Exec example!\n");pid = fork();switch(pid) {case -1:perror("Process Creation failed\n");exit(1);case 0:printf("Child process is running\n");printf("Execve pid = %d ,parentpid = %d\n",getpid(),getppid());printf("Execve uid = %d,gid =%d\n",getuid(),getgid());execve("processimage",argv, environ);//以下代码永远得不到运行的机会printf("process never go to here!\n");exit(0);default:printf("Parent process is running\n");break;}wait(&stat_val);exit(0);
}

先编译第一个程序,生成可执行文件:gcc -o processimage processimage.c。再编译第二个程序:gcc -o execve execve.c。运行结果为:

从以上结果看,执行新程序的进程保持了原来进程的进程ID、父进程ID、实际用户ID和实际组ID。同时,调用新的可执行程序后,原有的子进程的映像被替代,不再被执行。子进程永远不会执行到printf("process never go to here.\n");,因为子进程已经被新的执行映像所替代。

用exec()函数执行新程序相关推荐

  1. Linux 执行新程序:execve() 函数

    系统调用execve()函数作用 在Linux程序中,通过调用execve(),进程能够以全新程序来替换当前运行的程序.再次过程中,将丢弃旧有程序,进程的栈.数据以及堆段会被新程序所替换.这个 exe ...

  2. 关于linuxC语言中创建进程,利用execlp函数执行.c程序问题

    关于linuxC语言中创建进程,利用execlp函数执行.c程序问题 对于一个小白来说,这个系统调用真的太难了,完全摸不着头脑啊,一搜execlp函数,全是执行的命令,什么传参硬是没懂. 不过说到底, ...

  3. PHP中exec()函数执行系统命令失败

    0.说明 在php中,我们可以使用exec()来执行系统命令,但有时我们会遇到exec()命令执行不成功,或者无返回的情况,下面来说明一下: 1.函数 exec ( string $command [ ...

  4. windows下php的exec函数执行不成功的另一种原因

    今天忙活一天了,想用php调用一个exe程序.执行后一直返回1(返回0是成功),也看不到任何输出,$output也看不到东西. 从网上看了, 大部分文章都说是cmd.exe的权限问题.php开启了sa ...

  5. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  6. exec函数 终极总结

    进程控制之exec函数 用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行 ...

  7. 关于Qt中QDialog对话框调用exec()函数界面退出造成僵尸程序问题

    关于Qt中QDialog对话框调用exec函数产生的问题 问题一: 问题描述: 原因分析: 解决方案: 问题二: 问题描述: 求助:关于这个问题,学识尚浅,求大佬分析一波 问题一: QDialog对话 ...

  8. python exec函数_Python3 exec 函数

    Python3 exec 函数 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. 语法 以下是 exec 的语法: ex ...

  9. 8.10 exec函数

    8.10 exec函数 用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其m a i n函数开始执行.因 ...

最新文章

  1. java读取文件效率问题
  2. python对象的 init 和 del 方法
  3. python导入自定义文件_python引入导入自定义模块和外部文件的实例
  4. 解决win10系统下,git Bash闪退的问题
  5. 【Java从0到架构师】日志处理 - Log4j 1.x、JCL
  6. Python开发【第二篇】:初识Python
  7. 微信小程序 css边框阴影,微信小程序|CSS的内边距和圆框
  8. 台式机也应该设置为WIN10节能模式
  9. php接口前端,php 接口与前端数据交互实现示例代码
  10. (六)mybatis-spring集成完整版
  11. 计算机职业核心素养,计算机专业人才核心素养研究-计算机专业论文-计算机论文(10页)-原创力文档...
  12. Verilog 锁存器 触发器 寄存器区别
  13. 脑与认知科学基础(期末复习)
  14. C++ 栈实现逆波兰式求解运算式和两栈共享存储空间
  15. (转)清华博士王垠的退学申请——研究生,无论你想不想搞研究,都该读读这篇文章。
  16. iOS底层探索(十二)类的加载(中)
  17. java rd th 小票机_英语日期rd,th有什么区别,怎么运用
  18. 软测项目辅导综合教程
  19. 接口自动化测试概述及流程梳理
  20. NX二次开发-UFUN创建工程图注释UF_DRF_create_note

热门文章

  1. 病原微生物高通量测序:第二节 应用场景
  2. 不用action提交表单——JS实现
  3. IT运维服务的主要内容
  4. hbuilder前端需要的插件_这两款HTML5开发工具,前端开发工程师用了直呼内行
  5. Fabric链码实战(二)公民身份信息
  6. java se开发web_javaSE web开发 登录思路代码
  7. 停止抱怨的力量是多么强大!
  8. 史上最简洁C# 生成条形码图片思路及示例分享
  9. ECMAScript 6 简明教程(一文搞懂ES6)
  10. Python 练习实例100例—5