GNU make 支持同时执行多条命令。通常情况下,同一时刻只有一个命令在执行,
下一个命令只有在当前命令执行完成之后才能够开始执行。不过可以通过 make的命令
行选项“-j”或者“--job”来告诉 make 在同一时刻可以允许多条命令同时被执行(注
意,在 MS-DOS中此选项无效,因为它是单任务操作系统)。 
如果选项“-j”之后存在一个整数,其含义是告诉 make 在同一时刻可允许同时执
行命令的数目。这个数字被称为“job slots”。当“-j”选项之后没有出现一个数字时,
那么同一时刻执行的命令数目没有要求。使用默认的“job slots” ,值为 1。表示make
将串行的执行规则的命令(同一时刻只能有一条命令被执行)。 
并行执行命令所带来的问题是显而易见地: 
1.  多个同时执的命令的输出信息将同时被输出到终端。当出现错误时很难根据一
大堆凌乱的信息来区分是哪条命令执行错误。 
2.  在同一时刻可能会存在多个命令执行进程同时读取标准输入,但是对于标准输
入设备来说,在同一时刻只能存在一个进程访问它。就是说在某个时间点, make
只能保证此刻正在执行的进程中的一个进程读取标准输入流,而其它进程的标
准输入流将置无效。因此在一时刻多个执行命令的进程中只能有一个进程获得
标准输入,而其它需要读取标准输入流的进程由于输入流无效而导致致命错误
(通常此进程会得到操作系统的管道破裂信号而被终止)。 
 
这是因为:执行中的命令在什么时候会读取标准输入流(终端输入或重定向的
标准输入)是不可预测的。而得到标准输入的顺序总是按照先来先获得的原则。
那个命令首先被执行,那么它就可以首先得到标准输入设备。而其它后续需要
获取标准输入设备的命令执行进程,由于不能得到标准输入而产生致命错误。
在 Makefile 规则中如果存在很多命令需要读取标准输入设备,而它们又被允许
并行执行时,就会出现这样的错误。 
 
为了解决这个问题。我们可以修改 Makefile 规则的命令使之在执行过程中避免
使用标准输入。当然也可以只存在一个命令在执行时会访问标准输入流的
Makefile。 
3.  会导致make的递归调用出现问题。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐