摘要:本文主要讲述怎样在进程中执行新代码,以及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. Python开发基础-Day9-生成器、三元表达式、列表生成式、生成器表达式

    生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 pri ...

  2. 最近升级mysql5.7出现下面问题,ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by

    执行sql: SELECT * FROM `user_link` WHERE `group_id` IN ('78', '79') GROUP BY `link_id` 报错: SQLSTATE[42 ...

  3. Android异步消息处理机制(多线程)

    当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如果不将这类操作放在子线程里去执行,就会导致主线程被阻塞住,从而影响用户对软件的正常使用. ...

  4. luogu P1979 华容道

    solution 被假hash可了半天....sadQAQ code // luogu-judger-enable-o2 #include<queue> #include<cstdi ...

  5. BZOJ 1934 [Shoi2007]Vote 善意的投票(最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1934 [题目大意] 每个人对于投票都有自己原来的观点:1或者0, 他可以违背自己原来的 ...

  6. (疯狂java)第三课

    最近很忙,都没有看书,罪过... 第五章(面向对象上) 1.类是一种对数据结构的封装,也就是说,一个类在在理解上事存在实际的含义的,比如一个人类,人类也是个类,表明这个类不是家禽类,是有人的特点的生物 ...

  7. 1.1(JavaScript学习笔记)、JavaScript基础

    一.JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端 ...

  8. Hiho----拓扑排序

    拓扑排序·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选什么课么? 小H ...

  9. jquery接收后台数组或集合回显复选框

    公司使用的框架比较旧,没有使用el等表达式.如果后台传递的是数组,需要把数组转为以逗号分隔的字符串. <% String context = request.getContextPath(); ...

  10. Delphi控件开发浅入深出(三)

    三.开关控件TlincoSwitch 用过Delphi1(好古老的东东呀!)的人相信都记得这个开关控件 ,不知道当初Borland为什么把这么一个在开发普通应用程序中应用不到的工控控件放到Delphi ...