Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)

exec函数

exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。

exec族函数定义:
功能:
  在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
函数族:
  exec函数族分别是:execl, execlp, execle, execv, execvp, execvpe
函数原型:
在这里插入图片描述
返回值:
  exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。
参数说明:
path:可执行文件的路径名字
arg:可执行程序所带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束
file:如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。

exec族函数参数极难记忆和分辨,函数名中的字符会给我们一些帮助:
l : 使用参数列表
p:使用文件名,并从PATH环境进行寻找可执行文件
v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量
execl函数代码示例:
在这里插入图片描述
在这里插入图片描述
画红色矩形的地方,关于里面参数的相关可以看我之前写的文件编程文章Linux文件编程
运行结果:
在这里插入图片描述
运行结果显示,成功使用exec函数后,后面关于Yes的打印就不执行了!
这个是execl函数与system函数的重要区别!

与直接运行了man函数是一样的,只不过是参数不同
直接运行man.c:
在这里插入图片描述
目前只是浅层学习一下,所以只学习了这个,其他的函数可以参考这位大佬的文章,写的非常好!exec族函数

system函数

函数原型:
在这里插入图片描述
关于system函数内部的代码内容:
在这里插入图片描述
可见里面使用了exec族函数,文件路径为bin目录下的bin目录下的sh文件,文件名为sh,参数为-c,在虚拟机中,我们可以探究一下sh -c 有什么用?
在这里插入图片描述
发现使用sh -c ./man和./man都实现了同样的功能,执行文件./+可执行文件,在其前面加sh -c 也是如此,由此可得,system函数就是执行cmdstring,只要将“./+可执行文件名”传入即可!
在这里插入图片描述
小试验:
man函数与前面man函数一样
在这里插入图片描述
运行结果:
从运行结果就可以看出system函数和exec函数的区别,成功使用system函数后,其后面的关于Yes的打印依然执行!
在这里插入图片描述

popen函数

函数原型:
在这里插入图片描述
函数好处:可以获取运行的输出结果
参数说明:
  command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。

mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。

返回值:
  如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL,具体错误要根据errno判断

int pclose (FILE* stream)
  参数说明:
  stream:popen返回的文件指针
  返回值:
  如果调用失败,返回 -1

作用:
  popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。
小试验:
在这里插入图片描述
运行结果:
在这里插入图片描述
与直接使用sh -c ps运行的现象是一样的
直接使用:
在这里插入图片描述
这里使用popen函数并不会将代码中运行的程序的输出结果输出出来,而是将其收进一个“管道”内,上面实验输出了结果是因为使用了printf函数将其打印出来!
删除printf函数后现象(注释了printf):
在这里插入图片描述
运行结果:
可以看到啥都没有!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值