Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3520090
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类:

2012-12-19 12:37:51

Linux--exec函数族及system函数


exec函数族包含6个函数:

#include
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, const char *envp[]);
int execv(const char *path, const char *argv[]);
int execve(const char *path, const char *argv[], const char *envp[];
int execvp(const char *file, const char *argv[]);


参数申明:

execl的第一个参数是包含路径的可履行文件,后面是列表参数,列表的第一个为号令path,接 着为参数列表,最后必须以NULL停止。
execlp的第一个参数可以应用相对路径或者绝对路径。
execle,最后包含指向一个自定义景象变量列表的指针,此列表必须以NULL停止。
execv,v默示path后面接管的是一个向量,即指向一个参数列表的指针,重视这个列表的最后 一项必须为NULL。
execve,path后面接管一个参数列表向量,并可以指定一个景象变量列表向量。
execvp,第一个参数可以应用相对路径或者绝对路径,v默示后面接管一个参数列表向量。

exec被调用时会调换调用它的过程的代码段和数据段(然则文件描述符不变),直接返回到调用它的过程的父过程,若是失足,返回-1并设置errno。


例子:
#include
int main(int argc, char *argv[])
{
char *envp[]={"PATH=/tmp", "USER=lei", "STATUS=testing", NULL};
char *argv_execv[]={"echo", "excuted by execv", NULL};
char *argv_execvp[]={"echo", "executed by execvp", NULL};
char *argv_execve[]={"env", NULL};
if(fork()==0) {
if(execl("/bin/echo", "echo", "executed by execl", NULL)<0)
perror("Err on execl");
}
if(fork()==0) {
if(execlp("echo", "echo", "executed by execlp", NULL)<0)
perror("Err on execlp");
}
if(fork()==0) {
if(execle("/usr/bin/env", "env", NULL, envp)<0)
perror("Err on execle");
}
if(fork()==0) {
if(execv("/bin/echo", argv_execv)<0)
perror("Err on execv");
}
if(fork()==0) {
if(execvp("echo", argv_execvp)<0)
perror("Err on execvp");
}
if(fork()==0) {
if(execve("/usr/bin/env", argv_execve, envp)<0)
perror("Err on execve");
}
}

法度里调用了2 个Linux 常用的体系号令,echo和env。echo会把后面跟的号令行参数原封不动的打印出来,env用来列出所有景象变量。
因为各个子过程履行的次序无法把握,所以有可能呈现一个斗劲杂沓的输出--各子过程打印的成果交杂在一路,而不是严格遵守法度中列出的次序。
最常见的错误:
日常平凡的编程中,若是用到了exec 函数族,必然记得要加错误断定语句。因为与其他体系调用比起来,exec很轻易受伤,被履行文件的地位,权限等很多身分都能导致该调用的失败。
最常见的错误是:
1)找不到文件或路径,此时errno 被设置为ENOENT;
2)数组argv和envp忘怀用NULL停止,此时errno被设置为EFAULT;
3)没有对要履行文件的运行权限,此时errno被设置为EACCES。


system函数:
原型:
#include
int system (const char *string);
功能:
The system function runs the command passed to it as
string and waits for it to complete. The command is
executed as if the command ¥ sh −c string has been given
to a shell.
【也就是说,system要应用一个shell来启动指定的法度】


例:
#include
#include
int main()
{
printf("Running ps with system ");
system("ps −ax");
printf("Done. ");
exit(0);
}
阅读(631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~