Pertanyaan Mencegah perintah berhenti saat menekan CTRL + C


Jadi, saya memainkan beberapa Zork 1 dan saya pergi untuk menyalin beberapa teks untuk menunjukkan teman saya, tetapi saya tidak sengaja lupa menahan tombol shift saat menekan CTRL+C. Ini menghentikan perintah dan saya kehilangan data Zork saya ...

Apakah ada semacam "membantu" tip keluar mereka yang dapat saya gunakan untuk mencegah menghentikan perintah ketika menekan tombol CTRL+C?

Perhatikan bahwa Zork dijalankan di dalam terminal. Ini adalah permainan berbasis terminal di mana Anda memberi perintah untuk melakukan tindakan yang berbeda.


26
2018-06-06 02:42


asal


Jadi Anda ingin Ctrl + c untuk mencegah semua aplikasi berhenti sama sekali? Itu mungkin akan menjadi bencana di masa depan. - jobin


Jawaban:


Kombinasi kuncinya Ctrl+C mengirim karakter ^C (nilai byte 3). Ini menyebabkan terminal mengirim SIGINT sinyal ke program yang berjalan di latar depan¹. Tindakan konvensional untuk sinyal ini adalah untuk mengganggu perintah saat ini: program yang dirancang untuk memproses perintah berurutan kembali ke prompt level teratas mereka, sementara program dirancang sebagai perintah batch tunggal atau keluar dari interaksi berkelanjutan. Jelas program yang Anda gunakan dirancang sesuai dengan model kedua.

Kunci pengiriman sinyal ini adalah fitur antarmuka terminal umum di kernel, yang dibagikan oleh semua emulator terminal dan terminal fisik nyata. Anda dapat mengkonfigurasi kunci mana yang mengirim sinyal ini, serta kunci lainnya (terutama CtrlZ mengirim SIGSTOP untuk menangguhkan program latar depan) dengan stty perintah. Untuk mengalihkan kunci ke SIGINT ke Ctrl+_ (di terminal saat ini):

stty intr '^_'

Untuk menonaktifkannya sama sekali:

stty intr ''

Untuk mengatur ulang semua pengaturan ke default:

stty sane

Kunci tidak dapat berupa kombinasi tombol acak, itu harus menjadi nilai byte tunggal. Itu stty pengaturan dapat ditimpa oleh program - beberapa program (terutama program mode teks layar penuh) melakukan pemrosesan pintas keyboard mereka sendiri.

¹   Lebih tepatnya, untuk semua proses di latar depan  kelompok proses yang terminalnya adalah mengendalikan terminal.  


27
2018-06-06 21:40





CTRL + C mengirim sinyal interupsi (SIGINT, yang merupakan sinyal nomor 2) ke pekerjaan di latar depan. Anda dapat menonaktifkan ini dengan "menjebak" sinyal menggunakan trap '' 2 perintah sebelum memulai Zork.

Aktifkan kembali CTRL + C (untrap SIGINT) dengan trap 2.

Tip: Anda dapat menambahkan sesuatu seperti ini ke Anda ~/.bashrc:

alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"

Dengan cara ini Anda tidak akan pernah lupa untuk menonaktifkan dan mengaktifkan kembali sinyal dan lebih mudah untuk memulai permainan hanya dengan mengetik zork di terminal.

Catatan: Anda dapat menggunakan nama sinyal sebagai ganti nomor jika lebih nyaman bagi Anda, yaitu trap '' sigint atau trap '' int. Saya hanya terbiasa menggunakan angka, mis. di kill -9 dan seperti.


33
2018-06-06 02:59