首页 > 代码库 > 在进程中运行新代码
在进程中运行新代码
摘要:本文主要讲述如何在进程中运行新代码,以及exec系列函数的基本使用方法.
exec系列函数共有7函数可供使用,这些函数的区别在于:指示新程序的位置是使用路径还是文件名,如果是使用文件名,则在系统的PATH环境变量所描述的路径中搜索该程序;在使用参数时使用参数列表的方式还是使用argv[]数组的方式.
#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, .../* (char *)0, char *const envp[] */ );
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ... /* (char *)0 */ );
int execvp(const char *filename, char *const argv[]);
int fexecve(int fd, char *const argv[], char *const envp[]);
返回值:如果执行成功将不返回,否则返回-1,失败代码存储在errno中.
前4个函数取路径名作为参数,后两个是取文件名作为参数,最后一个是以一个文件描述符作为参数.
1)如果filename中包含/,则将其视为路径名.
2)否则就按PATH环境变量,在它所指的各目录搜寻可执行文件.
execl()函数用来执行参数path字符串所指向的程序,第二个及以后的参数代表执行文件时传递的参数列表,最后一个参数必须是空指针以标志参数列表为空.
例子1:演示exec()函数的基本使用.
execle()函数用来执行参数path字符串所指向的程序,第二个及以后的参数代表执行文件时传递的参数列表,最后一个参数必须指向一个新的环境变量数组,即新执行程序的环境变量.
例子2:
execlp()函数会从PATH环境变量所指的目录中查找文件名为第一个参数指示的字符串,找到后执行该文件,第二个及以后的参数代表执行文件时传递的参数列表,最后一个参数必须是空指针.
例子3:
execv()函数函数用来执行参数path字符串所指向的程序,第二个为数组指针维护的程序参数列表,该数组的最后一个成员必须是空指针.
例子4:
execvp()函数会从PATH环境变量所指的目录中查找文件名为第一个参数指示的字符串,找到后执行该文件,第二个及以后的参数代表执行文件时传递的参数列表,最后一个成员必须是空指针.
例子5:
几个函数之间非常相似,没有找到更好的方法记忆,通过简单的例子暂时了解一下它们之间的不同调用方式.字母联想也不靠谱:
字母p表示该函数取filename作为参数,并且用PATH环境变量寻找可执行文件.
字母l表示该函数取一个参数表,它与字母v互斥.
字母v表示该函数取一个argv[]矢量.
字母e表示该函数取envp[]数组.
在进程中运行新代码
用函数fork创建子进程后,如果希望在当前子进程中运行新的程序,可以调用exec函数执行另一个程序.当进程调用exec函数时,该进程用户空间资源(正文、数据、堆和栈)完全由新程序替代,新程序则从main函数开始执行.因为调用exec函数并没有创建新的进程,所以前后的进程ID并没有改变,也即内核信息基本不做修改.exec系列函数共有7函数可供使用,这些函数的区别在于:指示新程序的位置是使用路径还是文件名,如果是使用文件名,则在系统的PATH环境变量所描述的路径中搜索该程序;在使用参数时使用参数列表的方式还是使用argv[]数组的方式.
1.exec系列函数
函数定义:#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, .../* (char *)0, char *const envp[] */ );
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ... /* (char *)0 */ );
int execvp(const char *filename, char *const argv[]);
int fexecve(int fd, char *const argv[], char *const envp[]);
返回值:如果执行成功将不返回,否则返回-1,失败代码存储在errno中.
前4个函数取路径名作为参数,后两个是取文件名作为参数,最后一个是以一个文件描述符作为参数.
2.函数具体分析
当指定filename作为参数时:1)如果filename中包含/,则将其视为路径名.
2)否则就按PATH环境变量,在它所指的各目录搜寻可执行文件.
2.1 execl()函数
int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );execl()函数用来执行参数path字符串所指向的程序,第二个及以后的参数代表执行文件时传递的参数列表,最后一个参数必须是空指针以标志参数列表为空.
例子1:演示exec()函数的基本使用.
#include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <stdlib.h> int main() { pid_t pid; pid = fork(); if(pid<0) { printf("error fork:%m\n"); exit(-1); } else if(pid==0) { // execl("/bin/ls","ls","-l","/etc",(char *)0); } else { printf("parent process\n"); } return 0; }
输出:
2.2 execle()函数
int execle(const char *pathname, const char *arg0, .../* (char *)0, char *const envp[] */ );execle()函数用来执行参数path字符串所指向的程序,第二个及以后的参数代表执行文件时传递的参数列表,最后一个参数必须指向一个新的环境变量数组,即新执行程序的环境变量.
例子2:
#include <unistd.h> int main(int argc, char *argv[], char *env[]) { execle("/bin/ls","ls","-l", "/etc",(char *)0,env); return 0; }
输出:
2.3 execlp()函数
int execlp(const char *filename, const char *arg0, ... /* (char *)0 */ );execlp()函数会从PATH环境变量所指的目录中查找文件名为第一个参数指示的字符串,找到后执行该文件,第二个及以后的参数代表执行文件时传递的参数列表,最后一个参数必须是空指针.
例子3:
#include <unistd.h> int main() { execlp("ls", "ls", "-l", "/etc", (char *)0); return 0; }
输出:
2.4 execv()函数
int execv(const char *path, char *const argv[]);execv()函数函数用来执行参数path字符串所指向的程序,第二个为数组指针维护的程序参数列表,该数组的最后一个成员必须是空指针.
例子4:
#include <unistd.h> int main() { char *argv[] = {"ls", "-l", "/etc", (char *)0}; execv("/bin/ls", argv); return 0; }
输出:
2.5 execvp()函数
int execvp(const char *file, char *const argv[]);execvp()函数会从PATH环境变量所指的目录中查找文件名为第一个参数指示的字符串,找到后执行该文件,第二个及以后的参数代表执行文件时传递的参数列表,最后一个成员必须是空指针.
例子5:
#include <unistd.h> int main() { char *argv[] = {"ls", "-l", "/etc", (char *)0}; execvp("ls", argv); return 0; }
输出:
几个函数之间非常相似,没有找到更好的方法记忆,通过简单的例子暂时了解一下它们之间的不同调用方式.字母联想也不靠谱:
字母p表示该函数取filename作为参数,并且用PATH环境变量寻找可执行文件.
字母l表示该函数取一个参数表,它与字母v互斥.
字母v表示该函数取一个argv[]矢量.
字母e表示该函数取envp[]数组.
待续......
笔者:个人能力有限,只是学习参考...读者若发现文中错误,敬请提出.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来,慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------在进程中运行新代码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。