Bunuh proses yang ditangguhkan?

17

Saya sedikit bingung dengan:

% 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

Jadi saya mengundurkan diri untuk "melakukannya sendiri" dan bertanya-tanya mengapa nanti:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

Oh!

Masuk akal benar, sekarang saya berpikir tentang hal itu, yang vimharus berjalan agar penangan sinyal diberitahu untuk berhenti, dan untuk melakukannya.

Tapi jelas bukan yang saya maksudkan.

Apakah ada cara untuk "bangun dan keluar" dalam satu perintah? yaitu, alias bawaan untuk kill %N && fg %N?

Mengapa melanjutkan di latar belakang tidak berfungsi? Jika saya bgalih-alih fg, Vim tetap hidup sampai saya fg, yang memecah intuisi saya di atas.

OJFord
sumber

Jawaban:

20

vi-vi-viberasal dari iblis. Anda harus membunuhnya dengan api. Atau SIGKILL:

kill -KILL %1

Builtin kills cukup baik untuk mengirim SIGCONTke proses yang ditangguhkan sehingga Anda tidak harus melakukannya sendiri, tetapi itu tidak akan membantu jika proses memblokir sinyal yang Anda kirim atau jika menangani sinyal menyebabkan proses menjadi ditangguhkan lagi (jika proses latar belakang mencoba membaca dari terminal, secara default, itu akan dikirim SIGTTIN, yang menunda proses jika tidak ditangani).

PSkocik
sumber
1
Kenapa Anda akan menggunakan SIGABRT? Ini dimaksudkan untuk menunjukkan bug program. SIGKILL ada di sini karena Anda ingin mematikan program sekarang apakah mau atau tidak.
Gilles 'SO- stop being evil'
1
Sebenarnya, ini terlihat seperti SIGTERMproses tidur sekarang, setidaknya jika mereka tidak memiliki penangan untuk itu. Saya pikir itu tidak berfungsi seperti ini, karena saya ingat harus bgatau fgsesuatu sebelum itu akan menerima sinyal dan pergi. Tapi saya diuji dengan awk 'BEGIN{while(42){}}' &, dan strace kill $!, dan hanya ada satu kill(2)panggilan sistem, dengan SIGTERM.
Peter Cordes
6

vimsedang memasang penangan sinyal (dan mungkin juga pengaturan sigprocmask(2)) untuk mengabaikan sinyal umum sehingga file apa pun yang diedit tidak hilang karena kontrol yang tersesat + c atau sinyal kill acak. Sebuah program yang lebih sederhana siap dibunuh:

% 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

Membuat vimjalan keluar (dengan aman) akan memerlukan penangan sinyal vimyang menerima TERMatau USR1atau sesuatu, menyimpan (atau membuang?) Buffer, dll. Apa yang Anda coba lakukan untuk membuat vimjalan keluar seperti ini?

thrig
sumber
"Apa yang kamu coba lakukan untuk membuat vim keluar seperti ini?" - tidak ada, itu adalah file "tmp" yang benar-benar saya edit. vimhanya pilihan program yang salah untuk menguji penskorsan.
OJFord
1
"abaikan sinyal umum sehingga file yang sedang diedit tidak hilang karena kontrol yang tersasar + c atau sinyal membunuh acak" - tetapi begitu saya fgberhenti, itu hanya berhenti selama ditangguhkan?
OJFord
2
@OllieFord: Hanya SIGKILL membangunkan proses tidur sehingga bisa mati. Mengirim sinyal ke proses yang ditangguhkan yang memiliki penangan khusus untuk mereka tidak membangunkannya. (Selain itu SIGCONT, sinyal terus, tentu saja. bgDan fgkirim SIGCONT.)
Peter Cordes