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

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

私は少し混乱しています:

% 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を使用すると、fgVimは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あります。このままやめるにはどうしたいですか?vimTERMUSR1vim

関連情報