私は少し混乱しています:
% 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
代わりにIを使用すると、fg
VimはIまで生きます。fg
これは上記の直観を崩します。
答え1
vi-vi-vi
それは悪魔に属するものです。火で殺さなければなりません。またはSIGKILL
:
kill -KILL %1
組み込み関数は中断されたプロセスにkill
転送するのに十分なSIGCONT
ので、直接実行する必要はありません。ただし、プロセスが送信する信号をブロックしたり、プロセスが再び中断されるようにする信号を処理したりすることは役に立ちません(バックグラウンドプロセスが端末から読み取ろうとするとデフォルトで送信され、SIGTTIN
処理されない場合はプロセスが中断されます)。
答え2
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