execve替换进程映像(加载程序):
execve系统调用,意味着代码段、数据段、堆栈段和PCB全部被替换。
在UNIX中采用一种独特的方法,它将进程创建与加载一个新进程映像分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建一个进程之后,通常将子进程替换成新的进程映像,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。
例如:shell进程中,运行ps程序,首先fork一个新进程,再将新进程用ps程序替换。
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);      后面是可变参数,以NULL结尾.带p会在环境变量路径下搜索程序。
int execle(const char *path, const char *arg,.., char * const envp[]);     不在环境变量下搜索,但是可以带一个环境信息,可以见下面的例2。
int execv(const char *path, char *const argv[ ]);     v是将参数以NULL结尾放入一个char* const数组中[指针是const]
int execvp(const char *file, char *const argv[ ]);

例1:

 1 #include<unistd.h>
2 #include<sys/types.h>
3 #include<stdlib.h>
4 #include<stdio.h>
5 #include<errno.h>
6 #define ERR_EXIT(m)\
7 do\
8 {\
9 perror(m);\
10 exit(EXIT_FAILURE);\
11 }while(0) //宏要求一条语句
12 int main()
13 {
14 printf("Entering mian...\n");
15 execlp("ps","ps","-x",NULL); //将当前进程替换成ps程序
    //char *const args[]={"ps","-x",NULL};
    //execvp("ps",args);
16 /*
17 ps -a:显示现行终端机下的所有程序,包括其他用户的程序
18 ps -A:显示所有程序。
19 ps -u: 以用户为主的格式来显示程序状况
20 ps -x:显示所有程序,不以终端机来区分。
21 */
22 printf("Exiting main...\n");//不会输出了
23 return 0;
24 }

例2:

 1 //hello程序
2 #include<unistd.h>
3 #include<stdio.h>
4 //hello程序打印程序环境变量
5 extern char** environ;//全局变量,C库中已定义。指针的指针,指向一个指针数组 environ-->[...]数组中每一项指向一个环境信息。例如"TERM=VI00","SHELL=/bin/bash"
6 int main(void)
7 {
8 printf("hello pid=%d\n",getpid());
9 //打印环境变量
10 int i;
11 for(i=0;environ[i]!=NULL;i++)
12 {
13 printf("%s\n",environ[i]);
14 }
15 return 0;
16 }
17
18 //execle程序,将进程替换为上面的hello程序。
19 #include<unistd.h>
20 #include<sys/types.h>
21 #include<stdlib.h>
22 #include<stdio.h>
23 #include<errno.h>
24 #define ERR_EXIT(m)\
25 do\
26 {\
27 perror(m);\
28 exit(EXIT_FAILURE);\
29 }while(0) //宏要求一条语句
30 int main()
31 {
32 printf("Entering mian...\n");
33 //execl执行hello,execl就会将当前环境信息传递给hello.而当前进程环境信息从shell继承。所以hello打印的环境信息就是shell传给execl,再传过来的
    //printf("pid=%d\n",getpid());
34 //execl("./hello","hello",NULL); //替换前后进程ID不变

    //execl("hello","hello",NULL); //替换失败 No such file or dic...


35 char * const envp[]={"AA=11","BB=22",NULL};
36 execle("./hello","hello",NULL,envp);//不再是从shell继承环境变量信息,而是有自己指定
37 /*
38 Entering mian...
39 hello pid=53447
40 AA=11
41 BB=22
42 */
43 printf("Exiting main...\n");//不输出了
44 return 0;
45 }

例三:

  #include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0) //宏要求一条语句
int main()
{ printf("Entering mian...\n");
char * const args[]={"ls","-l",NULL};
// execlp("ls","ls","-l",NULL); //将当前进程替换成ps程序
execvp("ls",args);
printf("Exiting main...\n");//不会输出了
return 0;
}

exec系列函数详解的更多相关文章

  1. PHP输出缓存ob系列函数详解

    PHP输出缓存ob系列函数详解 ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额 ...

  2. PHP ob系列函数详解

    一. 相关函数简介:    1.Flush:刷新缓冲区的内容,输出.    函数格式:flush()    说明:这个函数经常使用,效率很高.    2.ob_start :打开输出缓冲区    函数 ...

  3. php Output Control 函数 ob_系列函数详解

    <?php /* * 输出缓冲控制 * * flush — 刷新输出缓冲 ob_clean — 清空(擦掉)输出缓冲区 ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲 ob_en ...

  4. exec族函数详解及循环创建子进程

    前言:之前也知道exec族函数,但没有完全掌握,昨天又重新学习了一遍,基本完全掌握了,还有一些父子进程和循环创建子进程的问题,还要介绍一下环境变量,今天分享一下. 一.环境变量 先介绍下环境的概念和特 ...

  5. 【Linux 进程】exec族函数详解

    exec族的组成: 在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **e ...

  6. js字符串和正则表达式中的match、replace、exec等函数详解

    正则并不是经常使用,而正则和字符串之间的函数关系又错综复杂,谁是谁的函数,又是怎么样的一种结果,往往我们是看一遍忘一遍,对此我是头疼不已,感觉自己是个笨蛋^_^. 为了以后不再查文档,特此把常用的函数 ...

  7. C++ list容器系列功能函数详解

    C++ list函数详解 首先说下eclipse工具下怎样debug:方法:你先要设置好断点,然后以Debug方式启动你的应用程序,不要用run的方式,当程序运行到你的断点位置时就会停住,也会提示你进 ...

  8. fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结

    一:fork()和vfork()的区别:    fork()函数可以创建子进程,有两个返回值,即调用一次返回两个值,一个是父进程调用fork()后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子 ...

  9. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

随机推荐

  1. Rust之路(4)——所有权

    [未经书面同意,严禁转载] -- 2020-10-14 -- 所有权是Rust的重中之重(这口气咋像高中数学老师 WTF......). 所有权是指的对内存实际存储的数据的访问权(包括读取和修改),在 ...

  2. 极简 Node.js 入门 - 5.2 url & querystring

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  3. day35 Pyhton 网络编程02

    一内容回顾 网络基础 网络应用开发架构 B/S架构   浏览器直接作为客户端的程序 C/S架构 B/S是特殊的C/S osi七层模型 应用层  python代码   http  https  ftp  ...

  4. 【C语言C++编程入门】——程序结构:构思!

    学习编程语言的最好方法是编写程序.一般来说,初学者编写的第一个程序是一个名为"Hello World"的程序,它简单地将"Hello World"打印到你的电脑 ...

  5. python GDAL 读写shp文件

    gdal包用于处理栅格数据,ogr用于处理矢量数据. 1 #!C:\Program Files\pythonxy\python\python.exe 2 #-*- coding:gb2312 -*- ...

  6. 不死的小强 .net core 微服务 快速开发框架 Viper 限流

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  7. 【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)

    测试App Service是否可以访问其他DNS 当应用服务(Azure App Service)创建完成后,想通过ping命令来查看是否可以访问其他站点或解析DNS,但是发现ping命令无法使用.这 ...

  8. js堆排序

    堆的预备知识 堆是一个完全二叉树. 完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满的情况下,右边才能缺失结点). 大顶堆:根结点为最大值,每个 ...

  9. 常见ascii码记忆

    常见字符的ASCII码值如下:空格的ASCII码值为32:数字0到9的ASCII码值分别为48到57:大写字母"A"到"Z"的ASCII码值分别为65到90:小 ...

  10. ssm整合之web.xml文件

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " ...