欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

exec函数族

程序员文章站 2022-07-15 09:25:56
...

1、exec函数族作用

  • 让父子进程执行不相干的操作。
  • 能够替换进程地址空间中的源代码.txt段
  • 当前程序中调用另外一个应用程序(首先想到exec之前需要fork)
  • 返回值:如果函数执行成功,不返回,执行失败,打印错误信息,退出当前进程

2、exec库函数

  • execl(默认传递了环境变量)

函数原型如下:

int execl(const char *path, const char *arg, ...);
path:替换程序的路径。
arg:文件名称。
... :可变参数
注意:该函数的参数是可变的,因此在参数输入完之后需以(char*)0结束

示例:

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

int main()
{
    printf("pid = %d\n",getpid());
    execl("/bin/ps","ps","-f",(char*)0);

    return 0;
}
  • execlp(不用传路径,程序在标准位置)

函数原型如下:

int execlp(const char *file, const char *arg, ...);
file:要加载程序的名称。
arg:文件名称。
...  :可变参数。
注意:标准目录一般指/bin目录,bin目录存放的是可执行程序。
不过具体情况根据环境变量而定,可以通过环境变量来设置其他的标准目录。
因此也可以理解为根据环境变量来加载可执行程序。

示例:

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

int main()
{
    execlp("ls","ls","-lah",(char *)0);//因为ls在标准目录(/bin),因此不用输入路径
    return 0;
}
  • execle(显示传递环境变量)

首先我们了解一下环境变量:

   环境变量指的是一组值,从用户登录后就一直存在,很多应用程序需要依靠它来确定系统的一些细节,我们最常见的环境变量是PATH,它指出了应到哪里去搜索应用程序,如/bin;HOME也是比较常见的环境变量,它指出了我们在系统中的个人目录。环境变量一般以字符串"XXX=xxx"的形式存在,XXX表示变量名,xxx表示变量的值。

下面是我们常见的main函数的函数原型:

int main(int argc, char *argv[], char *envp[]);
argc:参数个数
argv:参数内容
envp:环境变量

execle函数原型如下:

int execle(const char *path, const char *arg, ..., char * const envp[]);
envp 存放环境变量的指针数组

示例:

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

int main(int argc, char *argv[], char *envp[])
{
    execle("/bin/ls","ls","-lah", (char *)0, envp);
    return 0;
}
  • execv(将参数存入数组进行传递)

函数原型:

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

示例:

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

int main()
{
    char *argv[] = {"ps","-f",(char *)0};
    execv("/bin/ps",argv);
    return 0;
}
  • execvp(不用传路径 + 将参数存入数组进行传递)

函数原型:

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

示例:

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

int main()
{
    char *argv[] = {"ps","-f",(char *)0};
    execvp("ps",argv);
    return 0;
}
  • 系统调用execve(路径 + 参数(数组) + 环境变量(数组))

上面的五个exec函数是库函数,这个是系统函数;上面的五个exec函数最终都是调用这个函数实现的。 

函数原型:

int  execve(const  char  *filename, char *const argv[], char *const envp[]);

示例:

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

int main(int argc, char *argv[], char *envp[])
{
    char *argvv[] = {"ps","-f",(char *)0};//argvv不同于main函数中的参数列表argv
    execve("/bin/ps",argvv,envp);
    return 0;
}