进程学习7--exec族函数
来源:互联网 发布:macbook windows 截屏 编辑:程序博客网 时间:2024/05/24 07:25
概述
为什么需要exec函数
(1)fork子进程是为了执行新程序(fork创建了子进程后,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行)
(2)可以直接在子进程的if中写入新程序的代码。这样可以,但是不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制),譬如说我们希望子进程来执行ls -la 命令就不行了(没有源代码,只有编译好的可执行程序)
(3)使用exec族运行新的可执行程序(exec族函数可以直接把一个编译好的可执行程序直接加载运行)
(4)我们有了exec族函数后,我们典型的父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译连接成一个可执行程序(叫hello),(项目是一个多进程项目)主程序为父进程,fork创建了子进程后在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。
exec族的6个函数介绍
(1)execl和execv 这两个函数是最基本的exec,都可以用来执行一个程序,区别是传参的格式不同。execl是把参数列表(本质上是多个字符串,必须以NULL结尾)依次排列而成(l其实就是list的缩写),execv是把参数列表事先放入一个字符串数组中,再把这个字符串数组传给execv函数。
(2)execlp和execvp 这两个函数在上面2个基础上加了p,较上面2个来说,区别是:上面2个执行程序时必须指定可执行程序的全路径(如果exec没有找到path这个文件则直接报错),而加了p的传递的可以是file(也可以是path,只不过兼容了file。加了p的这两个函数会首先去找file,如果找到则执行执行,如果没找到则会去环境变量PATH所指定的目录下去找,如果找到则执行如果没找到则报错)
(3)execle和execvpe 这两个函数较基本exec来说加了e,函数的参数列表中也多了一个字符串数组envp形参,e就是environment环境变量的意思,和基本版本的exec的区别就是:执行可执行程序时会多传一个环境变量的字符串数组给待执行的程序。
正文
函数
函数原型
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char path, const char *arg, …, char const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
参数
返回值
测试代码
int main(int argc,char *argv){ pid_t Mypid_t1 = -1; Mypid_t1 = fork(); if(Mypid_t1>0)/* 父进程*/ { sleep(1); printf("this is parent progress.\r\n"); } else if(Mypid_t1 == 0)/*子进程*/ { printf("this is son progress.\r\n"); //execl("/bin/ls","ls","-a","-l",NULL);/*1*/ //char *arg[] = {"ls","-a","-l",NULL};/*2*/ //execv("/bin/ls",arg); execl("./hello","text1","text2",NULL); } return 0;}int main(int argc,char *argv[])/*hello.o中的代码*/{ int i=0; while(NULL != argv[i]) { printf("argv[%d] = %s\r\n",i,argv[i]); i++; } return 0;}/**********运行结果*************** 1&2的运行结果 this is son progress. total 5 drwxrwxrwx 1 root root 0 May 31 14:30 . drwxrwxrwx 1 root root 4096 May 31 14:21 .. -rwxrwxrwx 1 root root 7445 May 31 14:30 a.out -rwxrwxrwx 1 root root 369 May 31 14:30 demo.c this is parent progress. 3的运行结果 this is son progress. argv[0] = text1 argv[1] = text2 this is parent progress.*********************************/
参考
- 进程学习7--exec族函数
- 进程控制exec函数族
- 启动进程:exec函数族
- linux 系统编程-学习笔记7-进程/fork/vfork/exec函数族
- linux进程控制exec 函数族
- exec 函数族 --多进程编程
- linux 进程控制编程 exec族函数
- 进程编程中的exec函数族
- (进程的变身)exec函数族
- 进程程序替换---exec函数族
- 【Linux】进程控制—exec函数族
- Linux进程控制函数之exec()函数的学习
- Linux进程学习---exec()函数的学习
- Linux操作系统学习_用户进程之fork()与exec函数族篇
- UNIX环境编程学习笔记(20)——进程管理之exec 函数族
- Linux进程实践(3) --进程终止与exec函数族
- Linux进程实践(3) --进程终止与exec函数族
- Linux进程实践(3) --进程终止与exec函数族
- unity修改材质属性和更换shader
- 通过自定义的 Array 类来实现变长数组
- Android Studio 设置代码提示和代码自动补全快捷键--Eclipse 风格
- SqlServer 2016模糊匹配的几种方式和效率问题
- 51nod 1799 二分答案
- 进程学习7--exec族函数
- svn xp 32位系统的下载网址
- C# new的用法
- eclipse常用插件在线安装地址或下载地址
- 部署samba服务
- 编程第七十二、七十三天
- c#函数带this
- Charles 从入门到精通,抓包,抓取
- linux系统安装mysql