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 vim
harus 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 bg
alih-alih fg
, Vim tetap hidup sampai saya fg
, yang memecah intuisi saya di atas.
SIGTERM
proses tidur sekarang, setidaknya jika mereka tidak memiliki penangan untuk itu. Saya pikir itu tidak berfungsi seperti ini, karena saya ingat harusbg
ataufg
sesuatu sebelum itu akan menerima sinyal dan pergi. Tapi saya diuji denganawk 'BEGIN{while(42){}}' &
, danstrace kill $!
, dan hanya ada satukill(2)
panggilan sistem, denganSIGTERM
.vim
sedang memasang penangan sinyal (dan mungkin juga pengaturansigprocmask(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:Membuat
vim
jalan keluar (dengan aman) akan memerlukan penangan sinyalvim
yang menerimaTERM
atauUSR1
atau sesuatu, menyimpan (atau membuang?) Buffer, dll. Apa yang Anda coba lakukan untuk membuatvim
jalan keluar seperti ini?sumber
vim
hanya pilihan program yang salah untuk menguji penskorsan.fg
berhenti, itu hanya berhenti selama ditangguhkan?SIGKILL
membangunkan proses tidur sehingga bisa mati. Mengirim sinyal ke proses yang ditangguhkan yang memiliki penangan khusus untuk mereka tidak membangunkannya. (Selain ituSIGCONT
, sinyal terus, tentu saja.bg
Danfg
kirimSIGCONT
.)