Kill
殺死一個暫停的程序?
我有點困惑:
% 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
?為什麼在後台恢復不起作用?如果 I
bg
而不是fg
,Vim 會一直存活到 Ifg
,這有點打破了我的直覺。
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
來接受TERM
或USR1
或其他東西,保存(或丟棄?)任何緩衝區等。你想做什麼才能vim
像這樣退出?