欢迎来到军工软件开发人才培养基地——学到牛牛

exec函数族调用区分

时间:2024-05-06 07:01:10 来源:学到牛牛

exec函数族是用于在当前进程中启动一个新程序的函数,它有多个变种,用于不同的调用方式和参数组合,这些函数的初始参数是要执行的文件的名称。

exec函数一旦调用成功即执行新的程序,不返回。只有失败才返回,错误值-1。所以通常我们直接在exec函数调用后直接调用perror()和exit(),无需if判断。

 

其中比较常用的exec函数族包括:

int execl(const char *pathname, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *pathname, const char *arg, ..., char *const envp[] );

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

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

int execvpe(const char *file, char *const argv[],  char *const envp[]);

 

这些函数可以根据前缀“exec”后面的字母进行分组,下面将exac函数归为带l、带p、带v、带e 四类来说明参数特点。

 

I : ( list )      命令行参数列表

p : (path)     搜索file时使用path变量

v : (vector)    使用命令行参数数组

e : (environment)    使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量

 

带l 的exec函数:execl , execlp , execle

参数说明: 表示后边的参数以可变参数的形式给出且都以一个空指针结束。并且由于这些是可变函数,因此该指针必须强制转换为(char *) null。

这里要特别说明的是,文件名也是参数,所以第一个参数应该指向与正在执行的文件相关联的文件名。

示例:

#include<stdio.h>

#include <unistd.h>

int main()

{

    printf("process begin...\n");

    execl("/bin/ls",NULL);

    printf("process end ...\n");

    return 0;

}

执行结果:用execl 找到并执行ls,将当前进程main替换掉,所以process end ...” 没有在终端被打印出来。

xuedaon@xuedaon:~/XUEDAONIUNIU$ ./a.out 

process begin...

1.c  a.out  t  test.c

 

带v 的exec函数:execv , execvp , execvpe

参数说明:  char *const argv[]参数是一个指针数组,这些指针指向以空结尾的字符串,这些字符串表示新程序可用的参数列表。第一个参数应该指向与正在执行的文件相关联的文件名。指针数组必须以空指针结束。

 

示例:

#include<stdio.h>

#include <unistd.h>

int main()

{

    printf("process begin...\n");

    char *argv[] = {"ls","-a","-l",NULL};

    execvp("ls",argv);

    printf("process end ...\n");

    return 0;

}

执行结果:在当前目录下查看所有文件的详细信息(包括隐藏文件)

xuedaon@xuedaon:~/XUEDAONIUNIU$ ./a.out 

process begin...

总用量 64

drwxrwxr-x  2 xuedaon xuedaon  4096 1月  18 10:09 .

drwxr-xr-x 24 xuedaon xuedaon  4096 1月  18 10:06 ..

-rw-rw-r--  1 xuedaon xuedaon   184 1月  18 10:09 1.c

-rw-r--r--  1 xuedaon xuedaon 12288 1月  18 10:09 .1.c.swp

-rwxrwxr-x  1 xuedaon xuedaon 16792 1月  18 10:09 a.out

-rwxrwxr-x  1 xuedaon xuedaon 15588 1月   8 17:02 t

-rw-rw-r--  1 xuedaon xuedaon   388 1月  17 17:45 test.c

 

带e 的exec函数:execle, execvpe

参数说明: 调用者的环境通过参数envp指定。envp实参是一个指向以空结束的字符串的指针数组,必须以空指针结束。所有其他exec()函数(后缀中不包括'e')从调用进程的外部变量environ中获取新进程映像的环境。即将环境变量传递给需要替换的进程,原来的环境变量不再起作用。 

 

示例:

//  execle程序

#include<stdio.h>

#include <unistd.h>

int main()

{

    printf("process begin...\n");

    char *envp[] = {"AA=11","BB=22",NULL};

    execle("./env","env",NULL,envp);

    printf("process end ...\n");

    return 0;

}

 

//  env程序

#include <stdio.h>

 

extern char **environ;

int main()

{

    int i = 0;

    for(i = 0; environ[i] != NULL; i++)

    {   

        printf("%s\n",environ[i]);

    }   

    return 0;

}

 

 

执行结果:先运行env.c程序生成执行文件env放到当前路径下,在运行execle.c程序,发现我们设置的环境变量确实有传进来。

xuedaon@xuedaon:~/XUEDAONIUNIU$ ./execle 

process begin...

AA=11

BB=22

 

带p的exec函数:execlp, execvp

参数说明: 表示第一个参数无需给出具体的路径,只需给出函数名即可,系统会在PATH环境变量中寻找所对应的程序,如果没找到的话返回-1。

 

示例:

#include<stdio.h>

#include <unistd.h>

int main()

{

    printf("process begin...\n");

    execlp("ls","ls","-l",NULL);

    printf("process end ...\n");

    return 0;

}

执行结果:在当前目录下查看所有文件的详细信息

xuedaon@xuedaon:~/XUEDAONIUNIU$ ./a.out 

process begin...

总用量 44

-rw-rw-r-- 1 xuedaon xuedaon   155 1月  18 10:06 1.c

-rwxrwxr-x 1 xuedaon xuedaon 16736 1月  18 10:07 a.out

-rwxrwxr-x 1 xuedaon xuedaon 15588 1月   8 17:02 t

-rw-rw-r-- 1 xuedaon xuedaon   388 1月  17 17:45 test.c

 

exec函数族关系图: