摘要:本文主要讲述怎样在进程中执行新代码,以及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函数的更多相关文章

  1. 【Win 10 应用开发】在App所在的进程中执行后台任务

    在以往版本中,后台任务都是以独立的专用进程来运行,因此,定义后台任务代码的类型都要位于 Windows 运行时组件项目中. 不过,在14393中,SDK 作了相应的扩展,不仅支持以前的独立进程中运行后 ...

  2. SQL 禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项

    注:本文摘自:http://blog.csdn.net/heshengfen123/article/details/3597125 在执行SQL脚本过程中如果出现 禁止在 .NET Framework ...

  3. python中执行javascript代码

    python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext()     ctxt.enter()     ...

  4. java中执行js代码

    要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...

  5. JAVA中执行JavaScript代码并获取返回值

    JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...

  6. pyv8的安装和使用:python中执行js代码

    pyv8 的作用是在python中执行js代码,然后可以使用js里的变量等内容.python取得javascript里面的值.javascript取得python里面的值.python和javascr ...

  7. UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv

    原文:UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) ...

  8. Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...

  9. exec 家族库函数以及系统调用(execl,execle,execlp and execv,execvp,execve)

    (1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...

随机推荐

  1. SecureFXPortable中文乱码

    SecureFXPortable有一个非常奇怪的地方,明明在全局选项中已经将编码设置为UTF-8,但连接Linux还是会出现中文乱码. 后来发现这个全局选项竟然不对SecureFXPortable生效 ...

  2. C++中的error C2662,const的this指针问题

    今天在写C++代码的时候遇到一个错误,涉及到了常量的this指针的问题. 简化后的代码如下: #include <iostream> #include <string> usi ...

  3. 关于SOA

    什么是SOA SOA:面向服务的体系结构(Service-Oriented Architecture,SOA,也叫面向服务架构), SOA是指为了解决在Internet环境下业务集成的需要,通过连接能 ...

  4. VB程序打包方法之如何在发布安装之后不带源码

    很久之前,我发表了一片博客是VB程序如何打包,在那里面我总结了两个方法.有兴趣可以看看我的这篇博客http://blog.csdn.net/lu930124/article/details/88467 ...

  5. java面试笔试总结(一)--亲生经历的面试题

    说明:本文只是自己的一些心得体会,答案也是自己写的,正确与否,还需考证 java笔试题    1java笔试题1 启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7 ...

  6. mac下使用github 上传代码

    提起github相信大家都不会陌生,在这里就不再赘述了.作为开源代码库以及版本控制系统,使用好了确实会非常受益,再说的势利点,你找工作时给面试官说你经常维护自己的技术博客和github,相信你给他的印 ...

  7. 自定义Cell引发的悲剧。。。。

    这两天毕设,昨晚微调自定义的cell,之前用mrc的时候直接打开xib布局好自定义cell就行乐,不用去勾选Use Autolayout,可是昨晚开始,自定义cell中,label不能动态调高的问题, ...

  8. IIS_右键点击浏览网站没有反应

    现象: 点击浏览不会打开浏览器,没有任何反应   解决方法: 将IE设为默认浏览器即可  

  9. SDK里报错[NSConcreteMutableData wbsdk_base64EncodedString]

    百度一大堆都说在这个里加个-ObjC,然后加了还是有问题 最近谷歌了下才要加入这个才正常了,国内的开发者只是一知半解的………… 如果错误还没有解决, 下面这个可以帮到你:

  10. Netty游戏服务器之六服务端登录消息处理

    客户端unity3d已经把消息发送到netty服务器上了,那么ServerHandler类的public void channelRead(ChannelHandlerContext ctx, Obj ...