exec家族与system函数
创始人
2025-05-31 23:31:43

exec家族函数

NAMEexecl, execlp, execle, execv, execvp, execvpe - execute a fileSYNOPSIS#include extern char **environ;int execl(const char *pathname, const char *arg, .../* (char  *) NULL */);int execlp(const char *file, const char *arg, .../* (char  *) NULL */);int execle(const char *pathname, const char *arg, .../*, (char *) NULL, char *const envp[] */);int execv(const char *pathname, char *const argv[]);int execvp(const char *file, char *const argv[]);int execvpe(const char *file, char *const argv[],char *const envp[]);

可以观察一些这一组函数的后缀名称,无非就是在exec函数后面加上 l,p,e,v这几个字母。

  1. l : list => 函数参数列表指定进程参数。

  1. p:path => 到PATH环境变量这个路径中查找可执行程序

  1. e:environ => 父进程提供环境变量

  1. v:数组的方式提供进程参数

进程参数

自动搜索PATH

使用当前环境变量

execl()

列表

NO

YES

execlp()

列表

YES

YES

execle()

列表

NO

NO,提供环境变量

execv()

数组

NO

YES

execvp()

数组

YES

YES

execve()

数组

NO

NO,提供环境变量

看一下demo:

#include 
#include 
#include 
#include 
#include int main(int argc,char* argv[])
{char  pids[32] = {0};char* const ps_argv[] = {"pstree","-A","-p","-s",pids,NULL};char* const ps_envp[] = {"PATH=/bin:/usr/bin","TEST=Delphi",NULL};sprintf(pids,"%d",getpid());execl("/bin/pstree","pstree","-A","-p","-s",pids,NULL);execl("pstree","pstree","-A","-p","-s",pids,NULL);execle("/bin/pstree","pstree","-A","-p","-s",pids,NULL,ps_envp);execv("/bin/pstree",ps_argv);execvp("pstree",ps_argv);execve("/bin/pstree",ps_argv,ps_envp);return 0;
}

system函数

NAMEsystem - execute a shell commandSYNOPSIS#include int system(const char *command);

参数:程序名以及进程参数(如:pstree -A -p -s $$)

返回值:进程退出状态值

下面是system(...) 函数运行原理图,和我们自己创建的create_process(...)原理差不多。

来看一下demo1:

#include 
#include 
#include 
#include 
#include /*$$ : 表示当前进程的pid
*/int main(int argc,char* argv[])
{int result = 0;printf("current: %d\n",getpid());result = system("pstree -A -p -s $$");printf("result = %d\n",result);return 0;
}

编译输出:

wj@wj:~/WORK/Learning/DT/07/07-3$ gcc test.c -o test.out
wj@wj:~/WORK/Learning/DT/07/07-3$ ./test.out 
current: 72319
systemd(1)---systemd(1454)---gnome-terminal-(2307)---bash(57230)---test.out(72319)---sh(72320)---pstree(72321)
result = 0

看一下demo2:

//test.sh

echo "Hello world from shell..."
a=1
b=1
c=$(($a+$b))
echo "c = $c"
wj@wj:~/WORK/Learning/DT/07/07-3$ chmod 777 test.sh
wj@wj:~/WORK/Learning/DT/07/07-3$ ./test.sh
Hello world from shell...
c = 2

看一下demo3:

//test.c
#include 
#include 
#include 
#include 
#include /*wait: true  :代表父进程是否等待子进程结束wait: false :代表父进程不等待子进程结束
*/int create_process(char* path,char* const args[],char* const env[],int wait)
{int ret = fork();if(ret == 0){if(execve(path,args,env) == -1){exit(-1);}}if(wait && ret)  // 1.wait为true。2.并且父进程是否成功创建子进程?来共同解决父进程是否等待子进程结束?{waitpid(ret,&ret,0);}return ret;   //1.如果等待,ret为子进程的退出状态;2.如果不等待,返回为子进程的pid
}int main(int argc,char* argv[])
{char* target = argv[1];char* const ps_argv[] = {target,NULL};char* const ps_envp[] = {"PATH=/bin:/usr/bin","TEST=Delphi",NULL};int result =0;if(argc < 2) exit(-1);printf("current: %d\n",getpid());//result = create_process(target,ps_argv,ps_envp,1);result = system(target);printf("result = %d\n",result);return 0;
}
//helloworld.c
#include int main(int argc,char* argv[])
{printf("hello world\n");return 0;
}

编译运行输出:

wj@wj:~/WORK/Learning/DT/07$ gcc test.c -o test.out
wj@wj:~/WORK/Learning/DT/07$ ./test.out ./helloworld.out
current: 73126
hello world
result = 0

wj@wj:~/WORK/Learning/DT/07$ cp 07-3/test.sh ./
wj@wj:~/WORK/Learning/DT/07$ ls
07-3  helloworld.c  helloworld.out  test.c  test.out  test.shwj@wj:~/WORK/Learning/DT/07$ ./test.out ./test.sh
current: 73178
Hello world from shell...
c = 2
result = 0

system 和 create_process区别和联系

  1. system创建的是shell进程,功能比较强大,可以直接调用shell进程函数,但是这个功能强大(相对于我们自己创建的create_process函数来说)是以牺牲性能为代价的。

  1. 如果用 //result = create_process(target,ps_argv,ps_envp,1); 我们自己创建的create_process,则不能够调用shell进程函数。我们自己创建的create_process效率更高。

相关内容

热门资讯

洛阳市区有哪些大学,洛阳有几所... 洛阳市区有哪些大学目录洛阳市区有哪些大学洛阳有几所大学求洛阳各大高校地址洛阳的大学有哪些洛阳市区有哪...
霎时间的近义词是什么,“ 霎时... 霎时间的近义词是什么目录霎时间的近义词是什么“ 霎时间 ”的近义词与“霎时间”意思相近的词有什么?霎...
如何画机器猫的简笔画,机器猫的... 如何画机器猫的简笔画目录如何画机器猫的简笔画机器猫的简笔画是怎样的?如何画哆啦a梦叮当的图案-如何画...
磁卡没有磁了小妙招,交通卡没有... 磁卡没有磁了小妙招目录磁卡没有磁了小妙招交通卡没有磁性怎么办磁卡消磁了怎样让其恢复?磁卡没有磁了怎么...
华为畅享6s是什么处理器,华为... 华为畅享6s是什么处理器目录华为畅享6s是什么处理器华为畅享6s:参数详解华为畅享6S外观及性能评测...
京东方普工干什么活,北京京东方... 京东方普工干什么活目录京东方普工干什么活北京京东方茶谷累不累合肥京东方一线员工做什么京东方普工,特工...
燕城是哪个城市,我的人间烟火燕... 燕城是哪个城市目录燕城是哪个城市我的人间烟火燕城是哪个城市?秦国燕城是现在的哪里燕城是哪个城市燕城是...
什么是黑洞谢谢告诉我,黑洞的基... 什么是黑洞谢谢告诉我目录什么是黑洞谢谢告诉我黑洞的基本性质?黑洞是什么?什么是黑洞什么是黑洞谢谢告诉...
光疗美甲怎么卸除,光疗甲怎么卸... 光疗美甲怎么卸除目录光疗美甲怎么卸除光疗甲怎么卸光疗甲要怎么卸下来?光疗甲怎么卸掉光疗美甲怎么卸除 ...
巧克力是怎么做成的,巧克力是用... 巧克力是怎么做成的目录巧克力是怎么做成的巧克力是用什么做成的 巧克力是用啥做的巧克力是什么做的巧克力...
感慨生活不易但励志的句子,关于... 感慨生活不易但励志的句子目录生活很苦的励志说说 励志开心的说说关于在艰难的路上的励志句子生活不易下一...
等腰三角形三线合一怎么证明,如... 等腰三角形三线合一怎么证明目录等腰三角形三线合一怎么证明如果只告诉三角形是等腰三角形,那么直接能证明...
番禺有哪些公园好玩的,广州市番... 番禺有哪些公园好玩的目录番禺有哪些公园好玩的广州市番禺区有哪些公园广州番禺有哪些公园好玩番禺旅游必去...
研究生读几年研究生的介绍,研究... 研究生读几年研究生的介绍目录研究生读几年研究生的介绍研究生读几年学制研究生是啥啊?国内研究生读几年研...
擦什么可以让纹身变淡,抹点什么... 擦什么可以让纹身变淡目录擦什么可以让纹身变淡抹点什么可以淡化纹身什么可以淡纹身不花钱去掉纹身的小窍门...
61键电子琴各个琴键代表什么,... 61键电子琴各个琴键代表什么目录61键电子琴各个琴键代表什么如何认识61键电子琴电子琴上的按钮分别是...
汽车钣金是什么意思(汽车钣金是... 今天给各位分享汽车钣金是什么意思的知识,其中也会对汽车钣金是什么意思的照片进行解释,如果能碰巧解决你...
40尺的高柜集装箱尺寸是多少(... 本篇文章极速百科给大家谈谈40尺的高柜集装箱尺寸是多少,以及40尺的高柜集装箱尺寸是多少寸对应的知识...
斗罗大陆唐三的魂环分别是什么,... 斗罗大陆唐三的魂环分别是什么目录斗罗大陆唐三的魂环分别是什么唐家三少的《斗罗大陆》一书中,主角唐三的...
浅色硅胶手机壳脏了怎么清洗,硅... 1. 准备工具:洗洁精、牙膏、牙刷、风油精、棉签、橡皮擦和抹布。 以上内容仅供参考,可阅读硅胶...
英雄联盟lng是哪个战队,ln... 英雄联盟lng是哪个战队目录英雄联盟lng是哪个战队lng是哪个国家的战队lng打野tarzan哪国...
有没有学习美妆的软件,有什么教... 有没有学习美妆的软件目录有没有学习美妆的软件有什么教化妆的app?有什么美妆的APP有什么教化妆的a...
黑芝麻一天吃多少合适,每天吃多... 黑芝麻一天吃多少合适目录黑芝麻一天吃多少合适每天吃多少黑芝麻为宜黑芝麻每天吃多少合适?黑芝麻每天吃多...
东风标志307三厢车多长(东风... 今天给各位分享东风标志307三厢车多长的知识,其中也会对东风标志307三厢车多长多宽进行解释,如果能...
法国百科法国女人最钟爱的香水是... 本篇文章极速百科给大家谈谈法国百科法国女人最钟爱的香水是?,以及法国的什么香水最有名对应的知识点,希...
自然灾难电影有哪些 极速百科网... 自然灾难电影有哪些目录自然灾难电影有哪些自然灾难电影有哪些自然灾难片都有那些?像(后天)(烈火雄心)...
免费高速收费2023最新规定,... 今天给各位分享免费高速收费2023最新规定,高速费免费时间2023的知识,其中也会对202年高速路免...
紫砂壶水温高时会渗水是为什么(... 本篇文章极速百科给大家谈谈紫砂壶水温高时会渗水是为什么,以及紫砂壶烧成温度过高会影响透气性吗对应的知...
陕西省三原县属于哪个市,三原县... 陕西省三原县属于哪个市目录陕西省三原县属于哪个市三原县是哪个市的三原县是属于西安还是咸阳?三原邮编陕...
莫扎特的作品有哪些,莫扎特的名... 莫扎特的作品有哪些目录莫扎特的作品有哪些莫扎特的名曲有哪些?莫扎特有什么曲?莫扎特的作品有哪些?莫扎...