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

例2:

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

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


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

例三:

  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.  
  15. printf("Entering mian...\n");
  16. char * const args[]={"ls","-l",NULL};
  17. // execlp("ls","ls","-l",NULL); //将当前进程替换成ps程序
  18. execvp("ls",args);
  19. printf("Exiting main...\n");//不会输出了
  20. return 0;
  21. }

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. 第一个月多测师讲解__项目讲解以及注意事项(肖sir)

    一.目的讲解流程:(讲述业务时长10-15分钟为宜)1.自我介绍礼貌用语,姓名,籍贯,学校,个人技能,经验,表现,兴趣爱好等 ,1分钟 ,谢谢2.介绍项目的名字 ,项目的背景,(涉及什么架构)3.对项 ...

  2. jenkins 构建 job 并获取其状态的实现

    目录 BACKGROUND INVESTIGATION I 1. 连续触发的相同 job 构建不会重复入队 2. 连续触发的不同 job 构建会各自入队 3. 参数变动的相同 job 构建将分别入队 ...

  3. 界面酷炫,功能强大!这款 Linux 性能实时监控工具超好用!

    对于维护.管理Linux系统来说,它的性能监控非常重要,特别是实时监控数据,这个数据有利于我们判断服务器的负载压力,及时调整资源调配,也有助于更好的服务于业务.所以,今天民工哥给大家安利一款 Linu ...

  4. spring boot:用spring security加强druid的安全(druid 1.1.22 / spring boot 2.3.3)

    一,druid的安全保障有哪些环节要注意? 1,druid ui的访问要有ip地址限制 2,用户必须要有相应的权限才能访问druid 3,关闭重置功能 说明:stat-view-servlet.url ...

  5. linux时间校准 设置时间为上海时区

      [root@localhost log]# rm -f /etc/localtime [root@localhost log]# cp /usr/share/zoneinfo/Asia/Shang ...

  6. 一分钟了解"秒杀"系统

    关于秒杀,第一反应都是实现起来比较复杂.难点在于:并发读+并发写+设计兜底方案的实现. 比如QQ,虽然数据量很大,但是多数的数据都是细粒度的数据查询,锁冲突比较少:但12306涉及到大量的读写操作,对 ...

  7. mysql query cache 查询缓存

    查看本博文,并进行验证(验证结果与博文一致): https://blog.csdn.net/carmazhao/article/details/7088530 mysql默认是开启查询缓存的. 设置查 ...

  8. Phoenix的一些问题

    date: 2020-09-10 13:50:00 updated: 2020-09-14 16:30:00 1. Phoenix索引 全局索引:适合读多写少的场景.写数据时因为索引表分布在不同数据节 ...

  9. Vue.js 获得兄弟元素,子元素,父元素(DOM操作)

    e.target 是你当前点击的元素 e.currentTarget 是你绑定事件的元素 e.currentTarget.previousElementSibling.innerHTML 获得点击元素 ...

  10. 深度学习中卷积层和pooling层的输出计算公式(转)

    原文链接:https://blog.csdn.net/yepeng_xinxian/article/details/82380707 1.卷积层的输出计算公式class torch.nn.Conv2d ...