Linux exec函数族

1. 概念:

exec函数族提供了一种在进程中启动另一个程序执行的方法。
它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、
代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了

2. 何时使用exec?

1)当进程认为自己不能再为系统和用户做出任何贡献了时就可以调用exec函数,让自己执行新的程序

2)如果某个进程想同时执行另一个程序,它就可以调用fork函数创建子进程,然后在子进程中调用任何一个exec函数。
  这样看起来就好像通过执行应用程序而产生了一个新进程一样

3.相关函数:
  int execl(const char *path, const char *arg, ...);
  int execv(const char *path, char *const argv[]);
  int execle(const char *path, const char *arg, ..., char *const envp[]);
  int execve(const char *path, char *const argv[], char *const envp[]);
  int execlp(const char *file, const char *arg, ...);
  int execvp(const char *file, char *const argv[]);
  l : list列表,参数要以列表形式,展现出来。
  p : path路径,从系统环境变量中去找可执行文件
  v : 向量数组,将列表的参数装到数组中去。
  e : 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。envp也是一个以NULL结尾的字符串数组指针


4.使用区别:
1)可执行文件查找方式
  无p:指定完整的文件目录路径,
  有p:只给出文件名,系统会自动从环境变量“$PATH”所包含的路径中进行查找。
2)参数表传递方式
  有l:表示逐个列举的方式;
  有v:表示将所有参数构造成指针数组传递,其语法为char *const argv[]
3)环境变量的使用
  exec函数族可以默认使用系统的环境变量,也可以传入指定的环境变量。
  这里,以“e”(Enviromen)结尾的两个函数execle、execve就可以在envp[]中传递当前进程所使用的环境变量,一般为NULL即可

 

例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/*
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, const char *argv[])
{
    // 1
    execl("/bin/ls","ls","-l",NULL);
    printf("AAAA\n");
// 2 execlp("ls","ls","-l",NULL); // 3 char *buf[] = {"ls","-l",NULL}; execv("/bin/ls",buf); return 0; }

测试: 只有1 会执行,后面的都不执行, 因为exec启动的进程取代了原来的 数据段,代码段,堆栈段 printf 也不会执行

 

posted on 2019-05-27 19:17  管理员D  阅读(326)  评论(0编辑  收藏  举报

导航