중단된 프로세스를 종료하시겠습니까?

중단된 프로세스를 종료하시겠습니까?

나는 약간 혼란스럽다:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp

그래서 저는 그냥 "스스로 해보기" 위해 직장을 그만뒀고 나중에 그 이유가 무엇인지 궁금해졌습니다.

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

오!

이제 생각해 보니 vim신호 처리기가 종료하고 이 작업을 수행하라는 지시를 받으려면 실행 중이어야 합니다.

그러나 분명히 내가 원하는 것은 아닙니다.

단일 명령으로 "깨어나서 종료"하는 방법이 있습니까? 즉, kill %N && fg %N?에 대한 내장 별칭 입니다.

백그라운드 복구가 작동하지 않는 이유는 무엇입니까? bg대신 I 를 사용하면 fgVim은 I 까지 살게 되는데 fg, 이는 위의 직관을 무너뜨립니다.

답변1

vi-vi-vi그것은 마귀에게 속한 것입니다. 불로 죽여야 합니다. 또는 SIGKILL:

kill -KILL %1

내장된 함수는 중단된 프로세스에 kill전송하기에 충분 SIGCONT하므로 직접 수행할 필요가 없습니다. 그러나 프로세스가 보내는 신호를 차단하거나 프로세스가 다시 중단되도록 하는 신호를 처리하는 경우에는 도움이 되지 않습니다( 백그라운드 프로세스가 터미널에서 읽으려고 하면 기본적으로 전송되며 SIGTTIN, 처리되지 않으면 프로세스가 중단됩니다.

답변2

vim일반적인 신호를 무시하도록 신호 처리기가 설치(및 설정 sigprocmask(2))되고 있어 편집 중인 모든 파일이 길 잃은 컨트롤+C 또는 무작위 종료 신호로 인해 손실되지 않습니다. 더 간단한 프로그램은 쉽게 종료될 수 있습니다.

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop

(안전하게) 종료하려면 신호 처리기가 무언가 를 수락 하고 버퍼 등을 저장(또는 폐기?) vim해야 합니다 . 이대로 그만두 려면 어떻게 하고 싶나요 ?vimTERMUSR1vim

관련 정보