私は少し混乱しました:
% 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
まで生き続けます。
vi-vi-vi
は悪魔のものです。火でそれを殺さなければならない。またはSIGKILL
:
kill -KILL %1
組み込みのkill
sは、中断されたプロセスにSIGCONT
を送信するのに十分親切なので、自分で行う必要はありませんが、プロセスが送信中の信号をブロックしている場合は役に立ちませんまたは、シグナルを処理することでプロセスが再び中断された場合(バックグラウンドプロセスが端末から読み取ろうとした場合、デフォルトではSIGTTIN
が送信され、処理されない場合はプロセスが中断されます)。
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
を(安全に)終了するには、vim
にTERM
またはUSR1
などを受け入れ、バッファを保存(または破棄?)するシグナルハンドラが必要です。 。vim
をこのように終了させるために何をしようとしていますか?