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内部正确处理信号
这一章看的都比较懵,以后再看一遍吧。。