Program ed
, editor teks minimal, tidak dapat keluar dengan mengirimkannya interupsi menggunakan Ctrl- C, alih-alih mencetak pesan kesalahan "?" ke konsol. Mengapa tidak ed
keluar begitu saja ketika menerima interupsi? Tentunya tidak ada alasan mengapa pesan kesalahan samar lebih bermanfaat di sini daripada hanya keluar. Perilaku ini mengarahkan banyak pengguna baru ke dalam jenis interaksi berikut:
$ ed hello ? help ? exit ? quit ? ^C ? ^C ? ? ? ^D $ su # rm -f /bin/ed
Sungguh pemborosan yang tragis — mudah dihindari jika ed
hanya disetujui untuk diinterupsi.
Program keras kepala lainnya yang menunjukkan perilaku serupa adalah less
yang juga tampaknya tidak memiliki banyak alasan untuk diabaikan C-c
. Mengapa program-program ini tidak mengambil petunjuk saja?
Jawaban:
Ctrl+ Cmengirim SIGINT . Tindakan konvensional untuk SIGINT adalah kembali ke loop tingkat atas program, membatalkan perintah saat ini dan memasuki mode di mana program menunggu perintah berikutnya. Hanya program non-interaktif yang seharusnya mati karena SIGINT.
Jadi wajar jika Ctrl+ Ctidak membunuh ed, tetapi menyebabkannya kembali ke loop tingkat atas. Ctrl+ Cbatalkan baris input saat ini dan kembali ke prompt ed.
Hal yang sama berlaku untuk lebih sedikit: Ctrl+ Cmengganggu perintah saat ini dan membawa Anda kembali ke prompt perintahnya.
Untuk alasan historis, ed mengabaikan SIGQUIT ( Ctrl+ \). Aplikasi normal seharusnya tidak menangkap sinyal ini dan membiarkan diri mereka dihentikan, dengan dump inti jika diaktifkan.
sumber
The Unix V7
ed(1)
kode sumber adalah sebuah program C 1762-line primitif hanya dengan beberapa komentar, salah satunya adalah header ini komentar yang sangat-mencerahkan:Karena kode sumbernya sendiri tidak memberikan alasan apa pun, Anda hanya akan mendapatkannya dari pembuat program.
ed
pada awalnya ditulis oleh Ken Thompson di perakitan PDP-11 , tetapi Anda sebenarnya harus berbicara dengan siapa pun yang mengirimnya ke C. Itu mungkin Dennis Ritchie , karena ia menciptakan C untuk Unix, dan merupakan salah satu dari banyak yang menggunakan C untuk membuat Unix portabel untuk mesin non-PDP. Dr Ritchie tidak lagi ada untuk menjawab pertanyaan seperti itu.Pembacaan kode saya menunjukkan bahwa itu dilakukan untuk mencoba dan melestarikan isi salinan inti dari dokumen yang diedit. Anda akan melihat bahwa editor teks lain juga tidak mati Ctrl-C.
Inilah yang
ed
terjadi pada Ctrl-C:(Ya, K&R C. Kami tidak memerlukan penspesifikasi tipe pengembalian steenkin atau deklarasi parameter.)
Diterjemahkan ke dalam bahasa Inggris
ed
,:Registrasi ulang pengendali sinyal.
(Unix tidak mendapatkan sinyal pengaturan ulang otomatis hingga 4.3BSD , pada pertengahan 1980-an.)
Menulis baris baru, dan mengingatnya, melalui variabel global
lastc
.(
ed.c
memiliki sekitar enam puluh variabel global.)Memanggil
error()
fungsi, yang terkenal tidak lebih dari mencetak?
, dari perspektif pengguna.Dengan kata lain, itu mengatakan, "Kamu tidak benar-benar bermaksud melakukan itu, bukan?"
sumber
error(s)
masuked.c
adalah kembali ke loop pemrosesan utama. Itu melakukannya denganlongjmp()
panggilan. gemetared
, seperti program interaktif lainnya, gunakan Ctrl+ Cuntuk mengganggu tugas-tugas program itu sendiri.Ini sangat mirip dengan kasus normal, di mana ia mengganggu tugas yang berjalan di shell - perintah.
Dari perspektif pengguna, kedua varian sangat mirip. Penanganan sinyal berbeda: dalam kasus biasa, sinyal
SIGINT
dikirim ke proses latar depan, perintah berjalan, dan perintah menanganinya dengan keluar.Dalam kasus
ed
, sinyal dikirim ke proses latar depan,ed
misalnya. Jika ada tugas yang sedang berjalaned
, itu terputus dan prompt ditampilkan. Jika tidak ada tugas yang berjalan, tidak ada yang berubah.Perhatikan bagaimana shell juga tidak keluar pada Ctrl+ C, sama seperti
ed
. Dan itu keluar pada Ctrl+ D. Sekali lagi, sama sepertied
sumber
Ada tiga sinyal yang
ed
peduli:INT
HUP
QUIT
Spesifikasi POSIX dari
ed
kata berikut ini:Jadi, apa pun implementasi yang
ed
Anda gunakan, itu sesuai dengan spesifikasi POSIX sehubungan denganINT
sinyal (yang Ctrl+Cdikirimkan).Dalam hal ini, editor berperilaku seperti shell interaktif, yang juga tidak berakhir setelah menerima
INT
sinyal. Editor lain, sepertivi
dannano
melakukan hal yang sama.sumber
ed
yang saya miliki. Berperilaku dengan cara yang sama seperti shell, yang juga tidak berhenti saat menerimaINT
sinyal.