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. 【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!

    相信大家看过许许多多的关于计算机黑客.骇客.人工智能.AI方面的电影,每当黑客入侵某个五角大楼,某个网站时,都会出现这样一副画面: 入侵 或者这样的: 数字雨 然后就轻而易举的成功入侵夺取管理员权限了 ...

  2. 2020年sublime text3可用的注册码

    2020年sublime text3可用的注册码 最近终于找到可以用的sublime text3注册码了,仅供各位同学交流学习使用.用完请删除,购买正版! ----- BEGIN LICENSE -- ...

  3. PHP 超级全局变量 $_GET

    https://www.php.cn/php/php-superglobals.html https://m.php.cn/code/11853.html

  4. centos8平台用redis-cli对redis5监控和管理

    一,监控redis-server上正在执行的命令 1,打开a终端: [root@yjweb log]# /usr/local/soft/redis5/bin/redis-cli -h 127.0.0. ...

  5. python 安装matplotlib

    下载minianaconda 安装 进入cmd下 conda create --name python37 python=3.7  创建python3.7环境 conda activate pytho ...

  6. java 调用WebService【转】

    1.客户单编程方式(和第一种方式一样) //文件名:HelloService.java import javax.jws.WebMethod; import javax.jws.WebParam; i ...

  7. 往with as中写入数据的方法

    方法1:直接写入,使用union all,简单直观,但程序运行效率低,几百条就很慢了 with dw_wms_outbound_info_v100 as( select '10700001' as o ...

  8. RocketMQ扫盲篇

    本篇博客主要参考: <浅入浅出>-RocketMQ 敖丙 APACHE-RocketMQ Gitee RocketMQ官方文档 RocketMQ 实战与进阶 GitChat 又是好久没有写 ...

  9. xUtils简介和使用方法

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词) ...

  10. windows10下IntelliJ IDEA使用logback设置日志输出目录

    1.在项目的src/main/resources目录下新建文件:logback-spring.xml 2:在logback-spring.xml中进行如下配置: <?xml version=&q ...