继续翻译
5.4 Parallel Execution
======================
GNU `make' knows how to execute several recipes at once. Normally,
`make' will execute only one recipe at a time, waiting for it to finish
before executing the next. However, the `-j' or `--jobs' option tells
`make' to execute many recipes simultaneously. You can inhibit
parallelism in a particular makefile with the `.NOTPARALLEL'
pseudo-target (*note Special Built-in Target Names: Special Targets.).
On MS-DOS, the `-j' option has no effect, since that system doesn't
support multi-processing.
If the `-j' option is followed by an integer, this is the number of
recipes to execute at once; this is called the number of "job slots".
If there is nothing looking like an integer after the `-j' option,
there is no limit on the number of job slots. The default number of job
slots is one, which means serial execution (one thing at a time).
One unpleasant consequence of running several recipes simultaneously
is that output generated by the recipes appears whenever each recipe
sends it, so messages from different recipes may be interspersed.
Another problem is that two processes cannot both take input from the
same device; so to make sure that only one recipe tries to take input
from the terminal at once, `make' will invalidate the standard input
streams of all but one running recipe. This means that attempting to
read from standard input will usually be a fatal error (a `Broken pipe'
signal) for most child processes if there are several.
It is unpredictable which recipe will have a valid standard input
stream (which will come from the terminal, or wherever you redirect the
standard input of `make'). The first recipe run will always get it
first, and the first recipe started after that one finishes will get it
next, and so on.
5.4 并行执行
======================
GNU make 知道如何马上执行几个片段。通常,make 将一次只执行一个片段,等它执行完毕了,才执行下一个。但是-j 或者 --jobs 选项告诉make 去同时执行多个片段。你可以通过 .NOPARALLEL 伪目的来在特定的makefile中禁止 并发性。 (*note Special Built-in Target Names: Special Targets.)
在MS-DOS 系统, -j 选项没有效果,因为此系统不支持多任务处理。
如果-j 选项后面跟着一个整数,那么这个数代表可以同时执行的片段数目; 被称为 任务槽数。
如果没有 -j 选项的数值,那么对任务槽没有数目限制。任务槽的缺省值是1,意味着串行执行。
有一个不好的事情是,当几个片段并行运行的时候,各个片段产生的输出会各自输出,导致输出的信息看其俩有些混乱。
另一个问题是,两个处理不能从一个设备上互为输入;因此要确认只有一个片段一次要从终端取得一次输入,make 会只保留一个运行片段的输入流而禁止其它的。这意味着,对于众多的子进程而言,想要从标准输入中读数据会造成严重错误(一个破坏的管道信号)。
对于哪一个片段将要获得有效的输入流(来自于终端或者被你所重定向)是无法精确的。第一个片段将要总是先获得它,然后下一个片段再获得,依次类推。
后文待续