mengapa mengetik Ctrl + c dua kali menghentikan proses yang berjalan di Linux?

24

Ada beberapa program Linux, misalnya vlc, yang merekomendasikan pengetikan ctrl+ cdua kali untuk menghentikan eksekusi dari terminal jika program tidak berhenti setelah yang pertama.

Mengapa mengetik ctrl+ cdua kali berfungsi saat pertama kali tidak bekerja?

719016
sumber
6
[rujukan?]
Ignacio Vazquez-Abrams

Jawaban:

35

Apa yang dilakukannya sepenuhnya aplikasi khusus. Ketika Anda menekan ctrl+ c, emulator terminal mengirimkan sinyal SIGINT ke aplikasi latar depan, yang memicu "penangan sinyal" yang sesuai. Penangan sinyal default untuk SIGINT mengakhiri aplikasi. Tetapi program apa pun dapat menginstal pengendali sinyal sendiri untuk SIGINT (termasuk pengendali sinyal yang tidak menghentikan eksekusi sama sekali).

Rupanya, vlc menginstal penangan sinyal yang mencoba melakukan pembersihan / penghentian anggun pada saat pertama kali dipanggil, dan jatuh kembali ke perilaku default penghentian eksekusi secara instan ketika dipanggil untuk kedua kalinya.

Riccardo Murri
sumber
3
Pada beberapa sistem, sinyal akan dikembalikan ke SIG_DFL setelah panggilan ke pawang (untuk menghindari memanggil pawang dua kali pada sinyal yang sama); ini disebut semantik SysV. Banyak program tidak mengatur penangan sinyal kembali ke pengaturan pada program awal di akhir penangan. Ini biasanya merupakan bug pemrograman. Baca informasi lebih lanjut tentang halaman sinyal (2) .
Arcege
16

SIGINT , sinyal yang dikirim oleh Ctrl+ C, secara konvensional memberitahu program untuk keluar ke loop pemrosesan perintah utamanya, atau jika itu tidak masuk akal, untuk keluar dengan bersih. Beberapa program menjalankan prosedur pembersihan ketika mereka menerima SIGINT. Jika program sangat kacau sehingga prosedur pembersihan gagal, dalam beberapa program, Ctrl+ detik Cmenyebabkan program untuk segera keluar. Melakukan ini tergantung pada masing-masing pembuat program.

Jika tanda Ctrl+ kedua Ctidak mematikan program, coba Ctrl+ \, yang mengirimkan SIGQUIT , sinyal yang lebih keras (tetapi masih dapat ditangkap), atau coba Ctrl+ Zuntuk menunda program dan kemudian killperintah (mis. kill %1Yang mengirimkan SIGTERM , sinyal yang secara konvensional tidak terlalu kasar) dari SIGQUIT, ke nomor pekerjaan 1). Jika semuanya gagal, matikan program dengan kill -KILL, juga dikenal sebagai kill -9, mengirim sinyal SIGKILL yang tidak dapat ditandingi .

Gilles 'SANGAT berhenti menjadi jahat'
sumber