web-dev-qa-db-fra.com

Tuez un processus suspendu?

J'ai été légèrement confus 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é de simplement "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!

Sense vraiment, maintenant que je pense à cela, que vim doit être exécuté pour que son gestionnaire de signal soit dit de cesser de fumer et de le faire.

Mais évidemment pas ce que j'ai voulu.

Y a-t-il un moyen de "réveiller et quitter" dans une seule commande? C'est-à-dire un alias intégré pour kill %N && fg %N?

Pourquoi la reprise-t-elle dans le contexte ne fonctionne pas? Si je bg au lieu de fg _, Vim reste en vie jusqu'à ce que je fg, qui brise mon intuition ci-dessus.

17
OJFord

vi-vi-vi est du diable. Vous devez le tuer avec le feu. Ou SIGKILL:

kill -KILL %1

Les kills sont assez gentils pour envoyer SIGCONT à des processus suspendus afin de ne pas avoir à le faire vous-même, mais cela ne vous aidera pas si le processus bloque le signal que vous envoyez. Ou si la manipulation du signal provoque la suspension des processus (si un processus d'arrière-plan tente de lire à partir du terminal, il sera envoyé par défaut SIGTTIN, qui suspend le processus s'il est non confiné).

20
PSkocik

vim consiste à installer des gestionnaires de signal (et à définir probablement aussi sigprocmask(2)) pour ignorer les signaux communs afin que tous les fichiers édités ne soient pas perdus en raison d'un signal de jeu de contrôle égaré + C ou de tuer aléatoire. Un programme plus simple est facilement tué:

% 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

Rendre vim sortie (en toute sécurité) nécessiterait un gestionnaire de signal dans vim qui accepte TERM ou USR1 ou quelque chose, sauve (ou se défaçons?) Des tampons, etc. Qu'est-ce que vous essayez de faire pour avoir besoin de faire vim sortie comme ceci?

6
thrig