杀死一个挂起的进程?

杀死一个挂起的进程?

我有点困惑:

% 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,这有点打破了我的上述直觉。

答案1

vi-vi-vi是属于魔鬼的。你必须用火杀死它。或者SIGKILL

kill -KILL %1

内置函数kill足以发送SIGCONT到挂起的进程,这样您就不必自己执行此操作,但是如果进程阻止您发送的信号或者处理信号导致进程挂起,那么这将无济于事再次(如果后台进程尝试从终端读取,默认情况下,它将被发送SIGTTIN,如果未处理,则会挂起进程)。

答案2

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像这样退出?

相关内容