Linux_UNIX编程手册-读书笔记-第二十七章(程序的执行)

27.1 执行新程序:execve()

execve系统调用可以将新程序加载到某一进程的内存空间。在该过程中,将丢弃旧有程序。
在这里插入图片描述
参数pathname 包含准备载入当前进程空间的新程序的路径名。
argv 指定了传递给新进程的命令行参数。
envp 指定了新程序的环境列表。

27.2 exec 库函数

exec()提供了多种API选择,这些函数都构建于execve调用之上。在这里插入图片描述
这几个函数的区别看下面这个表就可以看得懂。
在这里插入图片描述
环境变量PATH:
PATH的值是一个以冒号为分隔,由多个目录名组成的字符串。

函数execvp和execlp会在PATH包含的每个目录中搜索文件。

输出PATH:

echo $PATH

若没有定义变量PATH,那么execvp()和和execlp()会采用默认的路径列表:.;/usr/bin:/bin

将程序参数指定为列表

如果在编程时已知某个exec()的参数个数,调用execle(),execlp()时就可以将参数作为列表传入。
这样比较便于实用

将调用者的环境传递给新程序

函数execlp(),execvp(),execl(),execv()不允许开发者显示指定环境列表,新程序的环境继承自调用进程。
这句不太懂=-=

执行由文件描述符指代的程序:fexecve()
在这里插入图片描述
在这里插入图片描述
看不懂 =-=

27.3 解释器脚本

所谓解释器,就是能够读取并执行文本格式命令的程序。
除了能够交互的读取和执行命令之外,解释器通常还具备一种能力:从被称为脚本的文本文件中读取和执行命令。

还是看不懂=-=

27.4 文件描述符与 exec()

由exec()的调用程序所打开的所有文件描述符在exec()的执行过程中会保持打开状态,且在新程序中仍然有效。
shell利用这一特性为其所执行的程序处理I/O重定向

例如执行

$ ls /tmp > dir.txt

在这里插入图片描述

27.5 信号与exec()

exec()在执行时会将现有进程的文本段丢弃。

所以会导致内核对所有已设信号的处置重置为SIG_DEL.

为此,SUSv3建议,在调用 exec()执行程序的过程中,不应当阻塞或忽略信号。

27.6 执行shell命令: system()

程序可以通过system()函数来执行任意的shell命令。
在这里插入图片描述
system函数创建一个子进程来运行shell ,并以之执行命令command.

system的优点:
在这里插入图片描述

但这些优点是以低效率为代价的。使用system运行命令需要创建至少两个进程。一个用于运行shell,另外一个或多个则用于shell所执行的命令。

shell的返回值:
在这里插入图片描述

在设置用户ID和组ID程序中避免使用system()

因为 shell对操作的控制有赖于各种环境变量,故而使用system()会不可避免地给系统带来安全隐患。

27.7 system()的实现

通过execl 来实现system():

一个缺乏型号信号处理的system实现:在这里插入图片描述

在system内部正确处理信号
在这里插入图片描述
在这里插入图片描述
这一章看的都比较懵,以后再看一遍吧。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值