Saya sering mulai membaca file besar dan kemudian ingin berhenti setelah beberapa saat, tetapi ada kelambatan dari menekan
Ctrl+ Cke program berhenti. Apakah ada peluang memperpendek kelambatan dengan menekan tombol Ctrl+ Cbeberapa kali? Atau apakah saya membuang penekanan tombol saya?
41
bash
, tetapi bukan kasuszsh
yang selalu menutup orangtua. Itu salah satu alasan saya sukazsh
.^C
ketika ia mendaftarkan pers (setidaknya bash tidak)Jawaban:
Setelah yang pertama Ctrl-C, program akan menerima
SIGINT
dan biasanya mulai membersihkan (menghapus file tmp, menutup soket, dll.). Jika Anda menekan Ctrl-Clagi ketika sedang terjadi, mungkin Anda mengganggu rutinitas pembersihan (yaitu sinyal tambahan mungkin ditindaklanjuti alih-alih dibiarkan sendiri), meninggalkan kekacauan. Walaupun biasanya tidak demikian, lebih umum sinyal tambahan dikirim setelahnyaproses selesai (karena keterlambatan yang melekat dalam interaksi operator dengan sistem). Itu berarti bahwa sinyal diterima oleh proses lain (sering kali shell, tetapi tidak selalu). Jika penerima itu tidak menangani sinyal ini dengan benar (seperti biasanya shell - lihat jawaban Jenny D) Anda mungkin akan terkejut dengan hasil dari tindakan semacam itu.sumber
INT
bahwa proses ini dapat diterima.trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10
. Jalankan skrip dan tekan ctrl-C dua kali. Anda akan melihat bahwa ctrl-C kedua dilewatkan ke rutin "bersihkan" (dalam pernyataan trap) dan mengakhirisleep
perintahnya.trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
Hanyasleep
perintah yang mendapatkan sinyal. Kami berdua salah xDisig
aktif, segera setelah CTRL-C ditekan dan diterima oleh kernel (untuk emulator terminal, segera setelah emulator terminal menuliskannya ke sisi master terminal semu), sinyal SIGINT dikirim ke semua proses dalam kelompok proses foreground terminal. Mungkin diblokir di sana, tetapi tidak akan dikirim nanti ke proses lain. Sekalipun buffer perangkat terminal penuh (aplikasi belum membaca apa pun yang Anda ketikkan), CTRL-C akan melewati antrian.Anda menyia-nyiakan mereka. Yang terjadi hanyalah setelah server selesai dengan output layar, ia akan menerima banyak Ctrl-C. Yang pertama akan digunakan untuk mematikan proses, dan yang berikut akan berakhir di shell Anda, yang kemudian akan terlihat seperti
sumber
Jawaban singkat : Jika proses bereaksi terhadapnya.
Jawaban panjang : Ketika Anda menekan ctrl+ ckernel mengirimkan sinyal ke proses. Sinyal mana yang dapat ditentukan oleh perintah berikut:
Lihat halaman manual dari
stty
:Ini sinyalnya
INT
, juga dikenal sebagai nomor 2. Ketika proses memiliki penangan sinyal, ia dapat bereaksi terhadap ini. Sebagian besar proses melakukan beberapa pekerjaan pembersihan untuk mengakhiri dengan sukses.sumber
kernel
(garis disiplin terminal, driver terminal) yang mengirimkan SIGINT ke setiap proses dalam kelompok proses latar depan terminal.Kamu benar. Tombol ditekan sedang terbuang sia-sia. Ketika Anda menekan Crtl+Cdan terdeteksi, ada sumber daya yang perlu dibersihkan, karena itu perlu waktu. Satu-satunya kasus yang saya tahu di mana penekanan Ctrl+Cdiperlukan, adalah ketika Anda ingin membatalkan proses pembaruan Yum, di mana Yum mengharuskan Anda menekan Ctrl+Cdua kali untuk mengonfirmasi bahwa Anda benar-benar ingin membatalkan.
sumber
Meskipun hanya satu Ctrl-Cyang diperlukan dalam kasus umum, ada beberapa situasi di mana mungkin diperlukan. Python, misalnya, menjebak Ctrl-Cketika sebuah thread baru sedang muncul, dan jadi jika ada yang salah di tengah memulai banyak thread, perlu untuk mengirim ulang beberapa kali agar dapat melewati
python
proses induk tanpa menjadi tertangkap.sumber
Saya selalu harus menekan Ctrlcbeberapa kali. Saya belum pernah menanggapi pada pers pertama, dan harus menggunakannya beberapa kali sampai sistem benar-benar menyadari ada Ctrlcyang dikirim. Sepertinya itu benar-benar merindukan / kehilangan sebagian besar dari mereka.
sumber