exec系列函数详解
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系列函数详解的更多相关文章
- PHP输出缓存ob系列函数详解
PHP输出缓存ob系列函数详解 ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额 ...
- PHP ob系列函数详解
一. 相关函数简介: 1.Flush:刷新缓冲区的内容,输出. 函数格式:flush() 说明:这个函数经常使用,效率很高. 2.ob_start :打开输出缓冲区 函数 ...
- php Output Control 函数 ob_系列函数详解
<?php /* * 输出缓冲控制 * * flush — 刷新输出缓冲 ob_clean — 清空(擦掉)输出缓冲区 ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲 ob_en ...
- exec族函数详解及循环创建子进程
前言:之前也知道exec族函数,但没有完全掌握,昨天又重新学习了一遍,基本完全掌握了,还有一些父子进程和循环创建子进程的问题,还要介绍一下环境变量,今天分享一下. 一.环境变量 先介绍下环境的概念和特 ...
- 【Linux 进程】exec族函数详解
exec族的组成: 在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **e ...
- js字符串和正则表达式中的match、replace、exec等函数详解
正则并不是经常使用,而正则和字符串之间的函数关系又错综复杂,谁是谁的函数,又是怎么样的一种结果,往往我们是看一遍忘一遍,对此我是头疼不已,感觉自己是个笨蛋^_^. 为了以后不再查文档,特此把常用的函数 ...
- C++ list容器系列功能函数详解
C++ list函数详解 首先说下eclipse工具下怎样debug:方法:你先要设置好断点,然后以Debug方式启动你的应用程序,不要用run的方式,当程序运行到你的断点位置时就会停住,也会提示你进 ...
- fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结
一:fork()和vfork()的区别: fork()函数可以创建子进程,有两个返回值,即调用一次返回两个值,一个是父进程调用fork()后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
随机推荐
- 第一个月多测师讲解__项目讲解以及注意事项(肖sir)
一.目的讲解流程:(讲述业务时长10-15分钟为宜)1.自我介绍礼貌用语,姓名,籍贯,学校,个人技能,经验,表现,兴趣爱好等 ,1分钟 ,谢谢2.介绍项目的名字 ,项目的背景,(涉及什么架构)3.对项 ...
- jenkins 构建 job 并获取其状态的实现
目录 BACKGROUND INVESTIGATION I 1. 连续触发的相同 job 构建不会重复入队 2. 连续触发的不同 job 构建会各自入队 3. 参数变动的相同 job 构建将分别入队 ...
- 界面酷炫,功能强大!这款 Linux 性能实时监控工具超好用!
对于维护.管理Linux系统来说,它的性能监控非常重要,特别是实时监控数据,这个数据有利于我们判断服务器的负载压力,及时调整资源调配,也有助于更好的服务于业务.所以,今天民工哥给大家安利一款 Linu ...
- 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 ...
- linux时间校准 设置时间为上海时区
[root@localhost log]# rm -f /etc/localtime [root@localhost log]# cp /usr/share/zoneinfo/Asia/Shang ...
- 一分钟了解"秒杀"系统
关于秒杀,第一反应都是实现起来比较复杂.难点在于:并发读+并发写+设计兜底方案的实现. 比如QQ,虽然数据量很大,但是多数的数据都是细粒度的数据查询,锁冲突比较少:但12306涉及到大量的读写操作,对 ...
- mysql query cache 查询缓存
查看本博文,并进行验证(验证结果与博文一致): https://blog.csdn.net/carmazhao/article/details/7088530 mysql默认是开启查询缓存的. 设置查 ...
- Phoenix的一些问题
date: 2020-09-10 13:50:00 updated: 2020-09-14 16:30:00 1. Phoenix索引 全局索引:适合读多写少的场景.写数据时因为索引表分布在不同数据节 ...
- Vue.js 获得兄弟元素,子元素,父元素(DOM操作)
e.target 是你当前点击的元素 e.currentTarget 是你绑定事件的元素 e.currentTarget.previousElementSibling.innerHTML 获得点击元素 ...
- 深度学习中卷积层和pooling层的输出计算公式(转)
原文链接:https://blog.csdn.net/yepeng_xinxian/article/details/82380707 1.卷积层的输出计算公式class torch.nn.Conv2d ...