在进程中执行新代码 execl、execle、execlp、execv、execve和execvp函数
摘要:本文主要讲述怎样在进程中执行新代码,以及exec系列函数的基本用法.
在进程中执行新代码
用函数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;
}
输出:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDAwNjEwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="139" width="600">
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;
}
输出:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDAwNjEwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="137" width="597">
几个函数之间很相似。没有找到更好的方法记忆,通过简单的样例临时了解一下它们之间的不同调用方式.字母联想也不靠谱:
字母p表示该函数取filename作为參数,而且用PATH环境变量寻找可运行文件.
字母l表示该函数取一个參数表。它与字母v相互排斥.
字母v表示该函数取一个argv[]矢量.
字母e表示该函数取envp[]数组.
待续......
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来。慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在进程中执行新代码 execl、execle、execlp、execv、execve和execvp函数的更多相关文章
- 【Win 10 应用开发】在App所在的进程中执行后台任务
在以往版本中,后台任务都是以独立的专用进程来运行,因此,定义后台任务代码的类型都要位于 Windows 运行时组件项目中. 不过,在14393中,SDK 作了相应的扩展,不仅支持以前的独立进程中运行后 ...
- SQL 禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项
注:本文摘自:http://blog.csdn.net/heshengfen123/article/details/3597125 在执行SQL脚本过程中如果出现 禁止在 .NET Framework ...
- python中执行javascript代码
python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext() ctxt.enter() ...
- java中执行js代码
要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...
- JAVA中执行JavaScript代码并获取返回值
JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...
- pyv8的安装和使用:python中执行js代码
pyv8 的作用是在python中执行js代码,然后可以使用js里的变量等内容.python取得javascript里面的值.javascript取得python里面的值.python和javascr ...
- UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv
原文:UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) ...
- Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...
- exec 家族库函数以及系统调用(execl,execle,execlp and execv,execvp,execve)
(1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...
随机推荐
- 【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)
2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超 ...
- JQuery总结+实例
JQuery是什么? Jquery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari ...
- 初见Python<6>:文件读写
1.open函数语法: python通过open函数打开文件,建立程序与文件之间的连接. open函数语法:open(filename[,mode[,buffering]]) 其中filename是指 ...
- BZOJ 2430 [Poi2003]Chocolate(贪心+归并排序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2430 [题目大意] 有一块n*m的矩形巧克力,准备将它切成n*m块. 巧克力上共有n- ...
- 【找规律】【DFS】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem A. Arithmetic Derivative
假设一个数有n个质因子a1,a2,..,an,那么n'=Σ(a1*a2*...*an)/ai. 打个表出来,发现一个数x,如果x'=Kx,那么x一定由K个“基础因子”组成. 这些基础因子是2^2,3^ ...
- awk算术运算一例:统计hdfs上某段时间内的文件大小
计算hdfs指定目录中所有文件名中包含2011-04-24的文件大小,并换算成GB: $HADOOP_HOME/bin/hadoop fs -du /user/hdfs/s3/ifocus/*201 ...
- web安全之如何防止CSRF跨站请求伪造
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...
- 判断 Selite中标存在或者字段存在的方法
判断表存在的方法很简单,网上很多: SELECT COUNT(*) FROM sqlite_master where type='table' and name='%s'" % tname; ...
- Atom 有什么优秀插件?
蓝色 ,主业三流青春校园小说作家兼反差萌段子手… 韦易笑等 130 人赞同 若是C / C++的话,我推荐ATOM的这几个插件主要用于代码补全,实时语法检测,以及代码格式调整,其实就是Clang的那一 ...
- 二、spring-boot文件配置
项目文件结构,新建的Springboot项目的文件结构如下: |-customer(项目名称) | - sec | | - main | | | - java | | | - resources | ...