Estaba un poco confundido por:
% 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
Así que renuncié a "hacerlo yo mismo" y me pregunto por qué más tarde:
% fg
[1] - continued vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated vim tmp
%
Oh!
Tiene sentido realmente, ahora que lo pienso, eso vim
tiene que estar ejecutándose para que se le diga a su manejador de señales que abandone, y que lo haga.
Pero obviamente no es lo que pretendía.
¿Hay alguna manera de "despertar y salir" en un solo comando? es decir, un alias incorporado para kill %N && fg %N
?
¿Por qué no funciona reanudar en segundo plano? Si yo en bg
lugar de fg
, Vim permanece vivo hasta que yo fg
, lo que rompe mi intuición anterior.
SIGTERM
que ahora despierta los procesos de sueño, al menos si no tienen controladores para ello. Creo que no solía funcionar de esta manera, ya que recuerdo haber tenido que hacerlobg
ofg
algo antes de que recibiera la señal y se fuera. Pero probé conawk 'BEGIN{while(42){}}' &
, ystrace kill $!
, y solo hay unakill(2)
llamada al sistema, conSIGTERM
.vim
está instalando manejadores de señal (y probablemente también configurandosigprocmask(2)
) para ignorar las señales comunes para que los archivos que se están editando no se pierdan debido a un control parásito + c o una señal de eliminación aleatoria. Un programa más simple se elimina fácilmente:Hacer la
vim
salida (de manera segura) requeriría un controlador de señalvim
que acepteTERM
oUSR1
algo, guarde (o descarte) cualquier memoria intermedia, etc. ¿Qué está tratando de hacer para que lavim
salida sea así?fuente
vim
fue solo una elección mal concebida del programa para probar la suspensión.fg
lo dejé, ¿solo se detuvo mientras estuvo suspendido?SIGKILL
despierta un proceso de sueño para que pueda morir. Enviar señales a un proceso suspendido que tiene controladores personalizados para ellos no lo despierta. (Aparte deSIGCONT
, la señal de continuación, por supuesto.bg
Yfg
enviarSIGCONT
.)