exec家族与system函数
创始人
2025-05-31 22:24:04
0

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效率更高。

相关内容

热门资讯

安卓9系统怎样应用分身,轻松实... 你有没有发现,手机里的APP越来越多,有时候一个APP里还要处理好多任务,分身功能简直就是救星啊!今...
获取安卓系统的ip地址,轻松获... 你有没有想过,你的安卓手机里隐藏着一个神秘的IP地址?没错,就是那个能让你在网络世界里找到自己的小秘...
LG彩电安卓系统升级,畅享智能... 你家的LG彩电是不是最近有点儿“闹别扭”,屏幕上时不时地跳出个升级提示?别急,今天就来给你详细说说这...
阴阳师安卓苹果系统,安卓与苹果... 亲爱的玩家们,你是否曾在深夜里,手握手机,沉浸在阴阳师的神秘世界?今天,就让我带你一起探索这款风靡全...
华为安卓系统区别在哪,独特创新... 你知道吗?最近手机圈里可是热闹非凡,尤其是华为的新动作,让很多人眼睛都瞪大了。没错,我说的就是华为自...
怎么重新刷安卓手机系统,深度解... 手机用久了,是不是感觉卡顿得厉害?别急,今天就来教你怎么重新刷安卓手机系统,让你的手机焕然一新,速度...
刷正版安卓系统教程,刷正版安卓... 你有没有想过,让你的安卓手机焕然一新,体验一把正版系统的魅力呢?别急,今天就来手把手教你如何刷正版安...
移动支撑系统安卓版,助力移动办... 你有没有发现,现在的生活越来越离不开手机了?无论是工作还是娱乐,手机几乎成了我们生活的必需品。而今天...
安卓怎么进win系统界面,安卓... 亲爱的安卓用户,你是否曾幻想过在安卓设备上直接体验Windows系统的魅力?别再羡慕那些Window...
incall可以升级安卓系统吗... 你有没有想过,你的手机是不是也能像电脑一样,时不时地来个系统升级呢?今天,咱们就来聊聊这个话题——i...
安卓系统带农历软件,尽享传统节... 你知道吗?现在智能手机上有个特别实用的功能,那就是农历显示。对于咱们中国人来说,农历可是有着深厚的历...
安卓系统资源占用高,揭秘原因与... 你有没有发现,你的安卓手机最近变得越来越慢了?是不是觉得打开一个应用都要等半天,甚至有时候还会卡死?...
安卓10的系统有哪些,功能升级... 你有没有发现,你的安卓手机最近是不是变得有点不一样了?没错,就是那个神秘的安卓10系统!它就像一位魔...
固态硬盘系统迁移到安卓,固态硬... 你有没有想过,把你的固态硬盘系统迁移到安卓设备上,是不是能让你在移动办公或者娱乐时更加得心应手呢?想...
平板电脑能玩安卓系统吗,畅享丰... 你有没有想过,平板电脑竟然也能玩安卓系统?这可不是天方夜谭,而是科技发展的新趋势。想象你手中的平板瞬...
安卓刷精简系统下载,轻松打造高... 你有没有想过,你的安卓手机是不是有点儿“臃肿”了呢?运行速度慢,电池续航短,有时候还卡得要命。别急,...
安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...