web-dev-qa-db-ja.com

中断されたプロセスを強制終了しますか?

私は少し混乱しました:

% 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ではなくfgの場合、VimはI fgまで生き続けます。

17
OJFord

vi-vi-viは悪魔のものです。火でそれを殺さなければならない。またはSIGKILL

kill -KILL %1

組み込みのkillsは、中断されたプロセスにSIGCONTを送信するのに十分親切なので、自分で行う必要はありませんが、プロセスが送信中の信号をブロックしている場合は役に立ちませんまたは、シグナルを処理することでプロセスが再び中断された場合(バックグラウンドプロセスが端末から読み取ろうとした場合、デフォルトではSIGTTINが送信され、処理されない場合はプロセスが中断されます)。

20
PSkocik

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を(安全に)終了するには、vimTERMまたはUSR1などを受け入れ、バッファを保存(または破棄?)するシグナルハンドラが必要です。 。vimをこのように終了させるために何をしようとしていますか?

6
thrig