调用exec并不创建新进程,只是用磁盘上的新程序替换了当前进程的正文段,数据段,堆段,栈段。
1.int execl(const char* pathname,const char* arg,....../* (char*)0 */);
int main()
{
pid_t id=fork();
if(id==0)
{
execl("/bin/ls","ls","-a","-l",NULL);
}
else
{
waitpid(id,NULL,0);
}
return 0;
}
第一个参数是要替换的新的程序,是取绝对路径名,第二个参数是表示怎么执行,将命令行上的参数说明为一个单独的参数,并要以空指针结尾。
2.int execv(const char* pathname,char* const argv[]);
int main()
{
pid_t id=fork();
if(id==0)
{
char* argv[]={"ls","-a","-l",NULL};
execv("/bin/ls",argv);
}
else
{
waitpid(id,NULL,0);
}
return 0;
}
先构造一个指向各个参数的指针数组,然后将该数组地址作为第二个参数。
3.int execle(const char* pathname,const char* arg,....../* (char*)0 */,
char* const envp[]);
int main()
{
pid_t id=fork();
if(id==0)
{
char* const envp[]={"MYPATH=/A/B",NULL};
execle("/home/wwr/code/exec/myexec","./myexec",NULL,envp);
}
else
{
waitpid(id,NULL,0);
}
return 0;
}
4.int execve(const char* pathname,char* const argv[], char* const envp[]);
这个是系统调用函数,其他6个函数都是在这个函数的基础上完成的。
5.int execlp(const char* filename,const char* arg,....../* (char*)0 */);
6.int execvp(const char* filename,char* const argv[]);
如果filename中包含/,则就将视为路径名,否则就按环境变量,在它所指定的目录中搜寻可执行文件。
7.int fexecve(int fd,char* const argv[], char* const envp[]);
第一个参数是文件描述符。
7个函数的返回值:成功,不返回,错误,返回-1.
总结: