Answers:
简而言之,您可以将其make
视为具有多个步骤(可能很多),其中每个步骤都将多个文件作为输入并创建一个文件作为输出。
步骤可能是“编译file.c
为file.o
”或“用于ld
链接main.o
并file.o
插入program
”。如果中断make
与CtrlC,则当前执行的步骤将被终止,这将(或应该)删除它正在对输出文件。通常不会留下任何“半就绪二进制文件”。
重新启动时make
,它将查看所有输入和输出文件的时间戳,然后重新运行以下步骤:
这通常意味着,如果一个步骤要花很长时间才能运行(在现代计算机上很少见,但是ld
对于大型程序而言,该步骤make
在设计时可能很容易花费几分钟),那么停止和重新启动make
将从头开始。
平均值的实际Makefile
情况比上面的描述要复杂得多,但是基本原理是相同的。
Ctrl+ C使a SIGINT
发送到正在运行的进程。该信号可以被过程捕获。在make源代码中,您可以在以下位置找到此信号的陷阱commands.c
:
/* If we got a signal that means the user
wanted to kill make, remove pending targets. */
if (sig == SIGTERM || sig == SIGINT
... remove childrens ...
/* Delete any non-precious intermediate files that were made. */
remove_intermediates (1);
remove_intermediates()
是的清理功能make
,请参见此处的定义:
/* Remove all nonprecious intermediate files.
If SIG is nonzero, this was caused by a fatal signal,
meaning that a different message will be printed, and
the message will go to stderr rather than stdout. */
在后面看到的功能中,它们将被有效删除:
status = unlink (f->name);
结论:
通常不建议您使用中断编译make
。如果不是不可捕获的信号(SIGKILL, SIGSEGV, SIGSTOP
),它将清除中间文件。
SIGSEGV
在许多Unices上都是可捕获的。