fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
二、成员介绍
1、int execve(const char *path, char *const argv[], char *const envp[])
参数:
path:被执行应用程序的完整路径
argv[]:传给被执行应用程序的命令行参数
envp[]:传给被执行应用程序的环境变量
例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc , char **argv)
{
int id;
id=fork();
if(id<0)
{
printf("fork error\n");
}
else if(id==0)
{
char *argv[]={"ls","-al","/etc/passwd",(char *)0};
char *envp[]={"PATH=/bin",0};
execve("/bin/ls",argv , envp);
}
else
{
}
return 0;
}
运行结果:-rw-r--r-- 1 root root 2008 Mar 9 02:45 /etc/passwd
2、int execv(const char *path, char *const argv[])
参数:
path:被执行应用程序的完整路径
argv[]:传给被执行应用程序的命令行参数
例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc , char **argv)
{
int id;
id=fork();
if(id<0)
{
printf("fork error\n");
}
else if(id==0)
{
char *argv[]={"ls","-al","/etc/passwd",(char *)0};
execv("/bin/ls" ,argv);
}
else
{
}
return 0;
}
运行结果:-rw-r--r-- 1 root root 2008 03-09 02:45 /etc/passwd
3、int execvp(const char *file, char *const argv[])
参数:
file:被执行的程序名,不包含路径,将从PATH环境变量中查找该程序
argv[]:传给被执行应用程序的命令行参数
例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc , char **argv)
{
int id;
id=fork();
if(id<0)
{
printf("fork error\n");
}
else if(id==0)
{
char *argv[]={"ls","-al","/etc/passwd",(char *)0};
execvp("ls", argv);
}
else
{
}
return 0;
}
运行结果:-rw-r--r-- 1 root root 2008 03-09 02:45 /etc/passwd
4、int execl(const char *path, const char *arg, ...)
参数:
path:被执行应用程序的完整路径
arg:以字符串形式列出命令行参数
例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc , char **argv)
{
int id;
id=fork();
if(id<0)
{
printf("fork error\n");
}
else if(id==0)
{
execl("/bin/ls", "ls","-al","/etc/passwd",(char *)0);
}
else
{
}
return 0;
}
运行结果:-rw-r--r-- 1 root root 2008 03-09 02:45 /etc/passwd
5、int execle(const char *path, const char *arg, ..., char *const envp[])
参数:
path:被执行应用程序的完整路径
arg:以字符串形式列出命令行参数
envp[]:传给被执行应用程序的环境变量
例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc , char **argv)
{
int id;
id=fork();
if(id<0)
{
printf("fork error\n");
}
else if(id==0)
{
char *envp[]={"PATH=/bin",0};
execle("/bin/ls", "ls","-al","/etc/passwd",(char *)0 ,envp);
}
else
{
}
return 0;
}
运行结果:-rw-r--r-- 1 root root 2008 Mar 9 02:45 /etc/passwd
6、int execlp(const char *file, const char *arg, ...)
file:被执行的程序名,不包含路径,将从PATH环境变量中查找该程序
arg:以字符串形式列出命令行参数
例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc , char **argv)
{
int id;
id=fork();
if(id<0)
{
printf("fork error\n");
}
else if(id==0)
{
execlp("ls", "ls","-al","/etc/passwd",(char *)0);
}
else
{
}
return 0;
}
运行结果:-rw-r--r-- 1 root root 2008 03-09 02:45 /etc/passwd
评论