注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

exec函数族  

2012-09-29 16:56:37|  分类: 应用层的简单介绍 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、功能介绍

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
  评论这张
 
阅读(560)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017