J'ai été légèrement dérouté par:
% 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
J'ai donc démissionné pour "le faire moi-même" et je me demande pourquoi plus tard:
% fg
[1] - continued vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated vim tmp
%
Oh!
Cela a vraiment du sens, maintenant que j'y pense, cela vim
doit être en cours d'exécution pour que son gestionnaire de signaux soit averti de quitter et de le faire.
Mais évidemment pas ce que je voulais.
Existe-t-il un moyen de "réveiller et quitter" en une seule commande? c'est-à-dire, un alias intégré pour kill %N && fg %N
?
Pourquoi la reprise en arrière-plan ne fonctionne-t-elle pas? Si je bg
au lieu de fg
, Vim reste en vie jusqu'à moi fg
, ce qui brise mon intuition ci-dessus.
SIGTERM
processus de veille se réveille maintenant, du moins s'ils n'ont pas de gestionnaires pour cela. Je pense que cela ne fonctionnait pas de cette façon, car je me souviens avoir dûbg
oufg
quelque chose avant de recevoir le signal et de s'en aller. Mais j'ai testé avecawk 'BEGIN{while(42){}}' &
, etstrace kill $!
, et il n'y a qu'un seulkill(2)
appel système, avecSIGTERM
.vim
installe des gestionnaires de signaux (et probablement aussi des paramètressigprocmask(2)
) pour ignorer les signaux communs afin que les fichiers en cours de modification ne soient pas perdus en raison d'un contrôle parasite + c ou d'un signal de suppression aléatoire. Un programme plus simple est facilement tué:Faire une
vim
sortie (en toute sécurité) nécessiterait un gestionnaire de signauxvim
qui accepteTERM
ouUSR1
ou quelque chose, enregistre (ou rejette?) Tous les tampons, etc. Qu'est-ce que vous essayez de faire pour avoir besoin de faire unevim
sortie comme ça?la source
vim
n'était qu'un choix de programme mal conçu pour tester la suspension.fg
l'ai quitté, il ne s'est arrêté que tant qu'il a été suspendu?SIGKILL
réveille qu'un processus de sommeil afin qu'il puisse mourir. L'envoi de signaux à un processus suspendu doté de gestionnaires personnalisés ne le réveille pas. (À partSIGCONT
, le signal continu, bien sûr.bg
Etfg
envoyerSIGCONT
.)