进程学习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.*********************************/

参考

原创粉丝点击