摘要:本文主要讲述怎样在进程中执行新代码,以及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. 用Pandas获取商品期货价格并可视化

     用Pandas获取商品期货价格并可视化 摘  要 1.用pandas从excel中读取数据: 2.用pandas进行数据清洗.整理: 3.用bokeh进行简单的可视化. 1.数据读取 本文主要是将获 ...

  2. sql 常见错误

    notFound = 1403L; .dupKey = -1L; openCloseErr = -2117L; cursorNotOpenErr = -1002L; .nullCursor = -14 ...

  3. Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列

    D. Least Cost Bracket Sequence 题目连接: http://www.codeforces.com/contest/3/problem/D Description This ...

  4. Linux下KVM的图形界面管理工具(WebVirtMgr)(Web版)

    WebVirtMgr面板 截图 介绍 WebVirtMgr是一个基于libvirt的Web界面,用于管理虚拟机.它允许您创建和配置新域,并调整域的资源分配.VNC查看器为来宾域提供完整的图形控制台.K ...

  5. QPS相关的概念收集(吞吐量(TPS)、QPS、并发数、响应时间(RT))

    一.概念: 1.响应时间(RT) 响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间.由于一个系统通常会提供许 ...

  6. quartz做集群配置较短的时间间隔会重复执行任务的问题

    quartz.properties org.quartz.jobStore.misfireThreshold = 60000 这个参数(单位为毫秒)设置了以后就是超时1min的就不执行,小于1min会 ...

  7. springCloud微服务使用

    一.微服务简介 1.演变过程:单体架构.SOA.微服务 2.单体架构:一个应用包含了应用之间所有的功能程序,通过打成war包的方式发布部署. 缺点:复杂性逐渐偏高.技术债务逐渐变慢.阻碍技术的创新扩展 ...

  8. Windows Server 2008 远程桌面连接拒绝

    (1)远程连接的时候在本地用户名添加域名 现象:在Windows2008R2配置成域控制器前,还没有安装AD,管理员Admistrator以及新创建的用户(创建的时候将该用户加入远程桌面管理组),发现 ...

  9. RMAN冗余备份概念与方法

    冗余备份概念 RMAN提供了一种更谨慎的备份策略:duplexed方式备份,其实质就是在生成备份集的同时,向指定位置copy指定份数(最大不超过4)的备份集复制,以避免在灾难性事故时数据库损坏和备份丢 ...

  10. scikit-learn(window,linux)安装

    scikit-learn是python的机器学习库 记录下载window中和linux中如何下载scikit-learn 方法一 直接下载Anaconda 这是一个非常齐全的python发行版本,里面 ...