Apakah menekan ctrl-c beberapa kali membuat program yang berjalan lebih cepat ditutup?

41

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?

Kucing Unfun
sumber
Saya perhatikan ketika menjalankan proses yang memanggil berbagai proses anak, Ctrl-C terkadang akan mengganggu anak yang sedang berjalan, tetapi bukan proses induk. Itu benar bash, tetapi bukan kasus zshyang selalu menutup orangtua. Itu salah satu alasan saya suka zsh.
joeytwiddle
17
Ya, sama seperti menekan tombol lift atau tombol cross-walk berulang kali akan menyebabkan elevator datang lebih cepat atau lampu berubah menjadi hijau lebih cepat.
Michael
3
Ya seperti halnya tombol elevator dan penyeberangan, CTRL-C juga bisa lengket atau berkarat atau mengembangkan koneksi yang rapuh. Menekan lebih banyak kali adalah taktik yang baik karena hanya satu pers yang harus mendaftar untuk elevator yang akan datang, tanda jalan untuk menyala, atau program untuk menutup.
hippietrail
1
@hippietrail tetapi shell Anda akan mencetak ^Cketika ia mendaftarkan pers (setidaknya bash tidak)
wchargin
1
Untuk apa nilainya, saya tidak menganggap itu membuang penekanan tombol saya - saya menganggap itu melampiaskan frustrasi dengan cara yang tidak merusak. (Saya biasanya menekannya 2-3 kali, tetapi itu sebagian karena saya "dibesarkan dengan" terminal yang terpasang pada saluran telepon di mana Anda tidak selalu dapat mengandalkan setiap penekanan tombol yang mencapai mesin.)
keshlam

Jawaban:

35

Setelah yang pertama Ctrl-C, program akan menerima SIGINTdan 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.

John1024
sumber
Mengapa harus mengganggu rutinitas pembersihan? Ini hanyalah sinyal lain INTbahwa proses ini dapat diterima.
kekacauan
4
@chaos Kenapa harus begitu? Seharusnya jika rutinitas pembersihan ditutup dan Anda ingin menghentikannya. Apakah ini bekerja seperti ini? Ya, cukup sering. Anda dapat menunjukkannya cukup sederhana: buat skrip bash dengan satu baris 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 mengakhiri sleepperintahnya.
John1024
1
@ John1024 Ah, sekarang saya melihatnya. Terima kasih untuk cuplikan skrip ^^ Tapi, pembersihan tidak dibatalkan lihat: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10Hanya sleepperintah yang mendapatkan sinyal. Kami berdua salah xD
kekacauan
2
Itu tidak benar. Pengiriman sinyal sinkron. Jika isigaktif, 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.
Stéphane Chazelas
1
Ya, sebagai contoh, VLC menginterpretasikan beberapa sinyal Ctrl + C sebagai cara untuk berhenti secara tidak jelas, sedangkan satu Ctrl + C akan berusaha untuk berhenti dengan bersih.
Jeremy Visser
11

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

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 
Jenny D
sumber
6
Proses tidak harus keluar saat mengirimnya SIGINT. Itu bisa tetap hidup tanpa batas waktu dan melakukan sesuatu yang berbeda setiap kali Ctrl + C ditekan.
Brian Gordon
Benar. Saya membuat asumsi tentang bagaimana pengguna membaca file.
Jenny D
5

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:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Lihat halaman manual dari stty:

   intr CHAR
          CHAR will send an interrupt signal

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.

kekacauan
sumber
Ctrl-Z biasanya mengirimkan SIGTSTP yang dapat ditangani (tidak seperti SIGSTOP).
peterph
4
Tidak, itu bukan shell yang mengirim SIGINT ke proses. Ini adalah kernel(garis disiplin terminal, driver terminal) yang mengirimkan SIGINT ke setiap proses dalam kelompok proses latar depan terminal.
Stéphane Chazelas
Pembaca masa depan, juga lihat unix.stackexchange.com/a/120071/135943 .
Wildcard
4

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.

Nav
sumber
2

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 pythonproses induk tanpa menjadi tertangkap.

Patrick Collins
sumber
1
Ini terjadi pada saya sekarang dan kemudian ketika saya membuat skrip python multi-threaded / diproses. Terkadang diperlukan beberapa mesin cetak sebelum proses utama terbunuh.
Leo
0

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.

pengguna280568
sumber