进程程序替换------>exec 函数家族

来源:互联网 发布:淘宝开放平台api 授权 编辑:程序博客网 时间:2024/06/05 07:48

    调用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.

总结:


原创粉丝点击