Byłem nieco zdezorientowany:
% 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
Zrezygnowałem więc z „zrobienia tego sam” i zastanawiam się, dlaczego później:
% fg
[1] - continued vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated vim tmp
%
O!
To naprawdę ma sens, teraz, gdy o tym myślę, że vim
musi działać, aby program obsługi sygnału otrzymał polecenie odejścia i zrobienia tego.
Ale oczywiście nie to, co zamierzałem.
Czy istnieje sposób „obudzić się i wyjść” za pomocą jednego polecenia? tj. wbudowany alias dla kill %N && fg %N
?
Dlaczego wznawianie w tle nie działa? Jeśli bg
zamiast tego fg
Vim pozostanie przy życiu, dopóki ja fg
nie złamie mojej powyższej intuicji.
SIGTERM
budzi się teraz proces uśpienia, przynajmniej jeśli nie mają do tego programów obsługi. Myślę, że nie działało to w ten sposób, ponieważ pamiętam, że musiałembg
lubfg
coś takiego, zanim otrzyma sygnał i odejdzie. Ale testowałem zawk 'BEGIN{while(42){}}' &
, istrace kill $!
, i jest tylko jednokill(2)
wywołanie systemowe, zSIGTERM
.vim
instaluje moduły obsługi sygnałów (i prawdopodobnie także ustawieniasigprocmask(2)
), aby ignorować typowe sygnały, aby edytowane pliki nie zostały utracone z powodu błędu sterowania + c lub losowego sygnału zabicia. Prostszy program jest łatwo zabijany:Wykonanie
vim
wyjścia (bezpiecznie) wymagałoby obsługi sygnału,vim
który akceptujeTERM
lubUSR1
coś, zapisuje (lub odrzuca?) Dowolne bufory itp. Co próbujesz zrobić, aby zrobićvim
takie wyjście?źródło
vim
był tylko źle przemyślanym wyborem programu do testowania zawieszenia.fg
przestałem, to zatrzymywało się tylko tak długo, jak długo było zawieszone?SIGKILL
Budzi tylko proces snu, aby mógł umrzeć. Wysyłanie sygnałów do zawieszonego procesu, który ma dla nich niestandardowe procedury obsługi, nie budzi go. (PozaSIGCONT
tym, oczywiście, kontynuuj sygnałbg
ifg
wyślijSIGCONT
.)