Kill

殺死一個暫停的程序?

  • August 15, 2015

我有點困惑:

% 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

為什麼在後台恢復不起作用?如果 Ibg而不是fg,Vim 會一直存活到 I fg,這有點打破了我的直覺。

vi-vi-vi屬於魔鬼。你必須用火殺死它。或者SIGKILL

kill -KILL %1

內置kill的 s 足以發送SIGCONT到掛起的程序,這樣您就不必自己做,但是如果程序阻塞了您發送的信號或者處理信號導致程序被掛起,這將無濟於事再次(如果後台程序嘗試從終端讀取,預設情況下,它將被發送SIGTTIN,如果未處理則暫停該程序)。

vim正在安裝信號處理程序(並且可能還設置sigprocmask(2))以忽略常見信號,以便任何正在編輯的文件都不會由於雜散 control+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將需要一個信號處理程序vim來接受TERMUSR1或其他東西,保存(或丟棄?)任何緩衝區等。你想做什麼才能vim像這樣退出?

引用自:https://unix.stackexchange.com/questions/223408