用exec()函数执行新程序
使用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()函数执行新程序相关推荐
- Linux 执行新程序:execve() 函数
系统调用execve()函数作用 在Linux程序中,通过调用execve(),进程能够以全新程序来替换当前运行的程序.再次过程中,将丢弃旧有程序,进程的栈.数据以及堆段会被新程序所替换.这个 exe ...
- 关于linuxC语言中创建进程,利用execlp函数执行.c程序问题
关于linuxC语言中创建进程,利用execlp函数执行.c程序问题 对于一个小白来说,这个系统调用真的太难了,完全摸不着头脑啊,一搜execlp函数,全是执行的命令,什么传参硬是没懂. 不过说到底, ...
- PHP中exec()函数执行系统命令失败
0.说明 在php中,我们可以使用exec()来执行系统命令,但有时我们会遇到exec()命令执行不成功,或者无返回的情况,下面来说明一下: 1.函数 exec ( string $command [ ...
- windows下php的exec函数执行不成功的另一种原因
今天忙活一天了,想用php调用一个exe程序.执行后一直返回1(返回0是成功),也看不到任何输出,$output也看不到东西. 从网上看了, 大部分文章都说是cmd.exe的权限问题.php开启了sa ...
- linux exec 二程序,二十五、Linux 进程与信号---exec函数
25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...
- exec函数 终极总结
进程控制之exec函数 用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行 ...
- 关于Qt中QDialog对话框调用exec()函数界面退出造成僵尸程序问题
关于Qt中QDialog对话框调用exec函数产生的问题 问题一: 问题描述: 原因分析: 解决方案: 问题二: 问题描述: 求助:关于这个问题,学识尚浅,求大佬分析一波 问题一: QDialog对话 ...
- python exec函数_Python3 exec 函数
Python3 exec 函数 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. 语法 以下是 exec 的语法: ex ...
- 8.10 exec函数
8.10 exec函数 用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其m a i n函数开始执行.因 ...
最新文章
- java读取文件效率问题
- python对象的 init 和 del 方法
- python导入自定义文件_python引入导入自定义模块和外部文件的实例
- 解决win10系统下,git Bash闪退的问题
- 【Java从0到架构师】日志处理 - Log4j 1.x、JCL
- Python开发【第二篇】:初识Python
- 微信小程序 css边框阴影,微信小程序|CSS的内边距和圆框
- 台式机也应该设置为WIN10节能模式
- php接口前端,php 接口与前端数据交互实现示例代码
- (六)mybatis-spring集成完整版
- 计算机职业核心素养,计算机专业人才核心素养研究-计算机专业论文-计算机论文(10页)-原创力文档...
- Verilog 锁存器 触发器 寄存器区别
- 脑与认知科学基础(期末复习)
- C++ 栈实现逆波兰式求解运算式和两栈共享存储空间
- (转)清华博士王垠的退学申请——研究生,无论你想不想搞研究,都该读读这篇文章。
- iOS底层探索(十二)类的加载(中)
- java rd th 小票机_英语日期rd,th有什么区别,怎么运用
- 软测项目辅导综合教程
- 接口自动化测试概述及流程梳理
- NX二次开发-UFUN创建工程图注释UF_DRF_create_note