make
전체 소스 트리를 다시 컴파일하지 않고도 언제든지 프로세스를 중단 할 수 있다는 것을 알고 있습니다 . 내가 아는 것처럼 make
대상이 아직 컴파일되지 않았거나 마지막 컴파일 후에 소스 코드가 수정 된 경우에만 대상을 컴파일합니다.
그러나 중단 make
하면 (동시성 수준에 따라) 절반 준비된 이진이 하나 이상 있어야합니다. 다음에 실행할 때 그들과 무엇을 make
합니까? 아니면 부분적으로 컴파일 된 바이너리를 피하기 위해 Ctrl+ C를 누르면 현재 대상이 완료 됩니까?
답변
간단히 말해서, make
각 단계는 많은 파일을 입력으로 사용하고 하나의 파일을 출력으로 작성하는 단계 수 (아마도 많은 수)를 갖는 것으로 생각할 수 있습니다 .
하는 단계 일 “컴파일 수 file.c
로 file.o
또는”사용 ” ld
링크 main.o
및 file.o
로 program
“. 당신이 방해하는 경우 make
에 CtrlC, 다음 현재 실행 단계 (또는해야한다)가 작업 된 출력 파일을 제거 할 종료됩니다. “반이 준비된 바이너리”가 남아 있지 않습니다.
다시 시작하면 make
모든 입력 및 출력 파일의 타임 스탬프를보고 다음 단계를 다시 실행합니다.
- 입력 파일이 출력 파일보다 새로운 타임 스탬프를 가짐
- 출력 파일이 존재하지 않습니다
이는 일반적으로 단계를 실행하는 데 시간이 오래 걸리는 경우 (현대 컴퓨터에서는 드문 일이지만 ld
큰 프로그램 의 단계 make
는 설계 시 몇 분이 걸릴 수 있음 ) 중지 및 다시 시작 make
하면 해당 단계가 처음부터 다시 시작 됩니다.
평균의 현실은 Makefile
위의 설명보다 상당히 복잡하지만 기본 사항은 동일합니다.
답변
Ctrl+ C는 SIGINT
실행중인 프로세스로 a 를 전송합니다. 이 신호는 프로세스에 의해 잡힐 수 있습니다. 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
잡을 수 없는 신호 ( ) 가 아닌 경우 중간 파일을 정리합니다.
답변
무언가가 중지되면 make
, 작업이 이미 완료 숙박 (가 CTRL-C, 종료, 또는 실패하더라도 명령 수). 재 작성 할 때 make
항상 수행합니다 여전히 (파일이 변경되거나 때문에 수행에 필요한 사항을 파악 make
문제가 처리 한있어 결코하지 않음) 및 작업로에 간다.
위의 설명은 관련 항목이 Makefile
올바르게 실행하기위한 종속성 및 명령을 설명한다고 가정 하므로 모든 (재) 제작해야합니다.