UNIX 系统中的程序执行与作业控制详解
1. UNIX 系统中程序执行方法概述
在 UNIX 系统里,程序员拥有一项强大的能力,即让一个程序执行另一个程序。像命令解释器(shell)就是这样一个简单的程序,它能为用户执行其他程序。若用户不喜欢现有的 shell,也可以自行编写。下面将介绍在其他程序中执行程序的方法。
2. 系统库例程执行程序
系统库例程是执行程序的一种简单方式。这个例程接受一个参数,即包含要执行命令的字符串。该命令字符串会直接传递给 UNIX Bourne shell(sh)并执行。由于是传递给 shell,所以使用系统库例程时,命令字符串可以包含输入和输出重定向命令,以及管道结构。shell 会读取这些命令并在各进程之间建立适当的连接。
不过,系统库例程存在三个主要问题:
- 灵活性不足:虽然可以执行命令,但执行命令的进程无法控制子进程。
- 开销大:在执行所需命令之前,系统会先执行一个 Bourne shell 进程。由于 shell 马上会执行其他操作,这会浪费处理器时间。
- 存在安全漏洞:为防止系统被随意攻击,这里不详细描述其安全问题。但要注意,设置了用户 ID(特别是超级用户 ID)的程序绝不能使用系统库例程来执行子进程。
3. 直接执行程序
除了使用系统库例程,还可以通过创建新进程直接执行程序。执行程序主要有三个步骤:创建新进程、让新进程执行其他程序以及等待进程终止。
3.1 创建进程
创建新进程的系统调用是fork。执行fork时,它会复制