Terminal berjalan ketika kita membukanya.
luvpreet@DHARI-Inspiron-3542:/$
Saya baru saja membukanya. Jadi, ketika saya menekan Ctrl+ C, mengapa itu tidak mematikan dirinya sendiri dan menutup terminal ??
command-line
luv.preet
sumber
sumber
Jawaban:
Ctrl+ Cadalah sinyal interupsi. Saat Anda mengetik ini di terminal, bash mengirim SIGINT ke pekerjaan di latar depan. Jika tidak ada pekerjaan (yang merupakan kasus ketika Anda baru saja membuka terminal), tidak ada yang terjadi. Program emulator terminal bukanlah pekerjaan yang berjalan di shell, jadi, itu tidak mendapatkan sinyal dan tidak menutup.
Jika Anda ingin menutup terminal dengan kunci kontrol, gunakan Ctrl+ D(EOF) yang menyebabkan bash keluar (dan juga menutup terminal).
Lihat juga: Bash Beginner's Guide pada sinyal dan secara lebih mendalam Bagaimana penanganan sinyal bekerja
perhatikan: jawaban ini telah diedit sejak komentar diposting
sumber
bash
akan menghentikan program apa pun ketika ctrl-c ditekan. Ini hanya akan memberi tahu kernel grup proses mana yang aktif dan kernel akan menghasilkan sinyal ke grup proses tersebut ketika menerima ctrl-c dari program terminal.The ^Ckeystroke, seperti penekanan tombol lain *, bukan sihir - itu mengirimkan keycode ke mana program yang memiliki fokus. (Dalam X, kode kunci adalah 54 untuk Cdengan pengubah 0x4 untuk Ctrl.) Program yang menerima aliran kunci bertanggung jawab untuk melakukan sesuatu yang sesuai dengan mereka - ingat bahwa dalam banyak aplikasi GUI, keystroke menyalin ke clipboard.
Ketika emulator terminal GUI (misalnya, Konsole) atau terminal virtual menerima penekanan tombol yang ditafsirkan ^C, ia dapat melakukan salah satu dari tiga hal. Jika terminal di modus baku , maka program berjalan telah meminta terminal tidak melakukan apa pun penanganan tombol khusus itu sendiri dan untuk lulus mereka langsung ke program. Beberapa program yang mendukung fitur-fitur canggih seperti pengeditan garis menerima input keyboard di beberapa konfigurasi di antara penekanan tombol mentah lengkap dan baris teks yang diproses;
bash
, misalnya, menerima penekanan tombol satu per satu. ^Cditafsirkan oleh terminal, tetapi kunci backspace dikirim ke shell apa adanya.Namun, sebagian besar program menggunakan mode matang (karena tidak mentah), di mana terminal menginterpretasikan beberapa penekanan tombol dasar sebelum benar-benar mengirimnya ke program (inilah sebabnya Anda dapat menggunakan backspace dalam
cat
). Dalam mode ini, terminal itu sendiri menerjemahkan ^Ckeystroke menjadiSIGINT
sinyal dan mengirimkannya ke proses anak. Karena terminal menghasilkan sinyal, itu tidak akan menjadi bingung dan berakhir.sumber
Ctrl
+Alt
+Delete
di dunia Windows, di mana kombinasi kuncinya cukup dekat dengan sulap (dapat digunakan untuk membuat Windows bekerja, itu ajaib di dalam dan dari dirinya sendiri!), Karena kode itu dimasukkan ke dalam sistem untuk mengganggu dan menimpa hampir semua segalanya — sangat mirip denganSysRq
itu.cbreak
/-icanon
, tetapi tidak meninggalkanisig
mode yang ditetapkan, dan tidak menerima sinyal nyata ketika Anda menekan tombol yang dipetakan ke mereka. Ini menanganiSIGINT
dengan berperilaku seperti yang Anda jelaskan (tidak hanya membatalkan pengeditan baris, itu juga membatalkan semua perintah internal yang mungkin berjalan dalam satu lingkaran), dan sepenuhnya mengabaikanSIGTSTP
danSIGQUIT
. Program lain, seperti vi, mungkin tidak.Ctrl
+Alt
+Delete
dulunya lebih ajaib daripada hari ini - blogs.msdn.microsoft.com/oldnewthing/20140912-00/?p=44083 . Meskipun saya adalah orang yang suka Linux, saya sering terpesona melihat sejauh mana Windows membuat hal-hal yang ramah pengguna dan logis dengan sumber daya yang terbatas di masa-masa awal.^c
tidak akan mematikan window manager :). Tidak dapat mengomentari karakter mentah / matang pada suatu waktu, tetapi jawabannya tepat tentang bagaimana keystroke itu dihasilkanSIGINT
^Cbiasanya dipetakan (lihat
stty -a
) keSIGINT
sinyal (lihatman 7 signal
).Yang tidak tertangkap
SIGINT
mengganggu proses yang berjalan, TAPI ...SIGINT
adalah salah satu sinyal bahwa suatu proses dapat menentukan perilaku untuk ("Menangkap sinyal").Apa yang Anda sebut "terminal" menangkap
SIGINT
, dan kembali bekerja.sumber
Ketika saya masih pemula saya kehilangan bagian bahwa ketika saya menggunakan baris perintah saya sebenarnya menggunakan dua program yang terpisah, terminal dan shell (misalnya bash)
Shell adalah apa yang mungkin sudah Anda ketahui, sebuah program yang mengambil perintah input atau skrip, mengeksekusi mereka dan mencetak hasilnya.
Terminal di sisi lain seperti seorang pria di tengah-tengah antara pengguna dan program (program yang biasanya berupa shell seperti bash atau ikan). Apa yang dilakukan terminal adalah membaca input misalnya dari keyboard, mungkin memproses input itu dengan cara tertentu, dan mengarahkannya ke program lain (bash).
Juga ini bekerja dengan cara lain juga, ketika program lain mengeluarkan sesuatu, bahwa sesuatu dialihkan ke terminal, maka tugas terminal untuk menampilkan sesuatu ke layar. Di antara mendapatkan input dan mencetaknya ke layar terminal dapat menginterpretasikan input yang didapatnya dengan berbagai cara.
Sebagai contoh jika suatu program mengeluarkan urutan berikut:
Terminal akan menampilkan ke layar "beberapa teks foobar tambahan" dengan huruf berwarna merah. Ini karena terminal memilih untuk memperlakukan kode aneh itu dengan cara khusus yang mengisyaratkan kode itu untuk mencetak keluaran berikut dengan warna merah.
Demikian pula ketika pengguna menekan
Ctrl - C
, satu-satunya hal khusus tentang ini adalah bahwa terminal memilih untuk memperlakukannya dengan cara khusus, tidak ada yang istimewa tentang urutan kunci ini. Secara khusus ini mengisyaratkan untuk mengirim sinyal interupsi (SIGINT) ke proses yang berjalan di dalam terminal, yaitu shell. Jika pada saat itu ada program yang telah dihasilkan oleh shell dan saat ini berjalan di latar depan juga menerima sinyal. Sekarang shell memiliki handler khusus untuk sinyal ini dan tidak ada yang terjadi. Tetapi sebagian besar program memiliki penangan default yang dalam kasus SIGINT hanya keluar.sumber
Setiap sinyal memiliki aksi default yang terkait dengannya. Tindakan default untuk sinyal adalah tindakan yang dilakukan skrip atau program saat menerima sinyal.
Ctrl+ Cmengirimkan sinyal "interrupt" ( SIGINT ), yang secara default menghentikan proses untuk pekerjaan yang berjalan di latar depan.
Ctrl+ Dmemberi tahu terminal bahwa ia harus mendaftarkan EOF pada input standar, yang mem-bash interpretasikan sebagai keinginan untuk keluar .
Suatu proses dapat memilih untuk mengabaikan sinyal INT, dan Bash melakukannya ketika itu berjalan dalam mode interaktif.
Dari manual :
Pahami dengan perangkap :
trap adalah fungsi yang dibangun ke dalam shell yang merespon sinyal perangkat keras dan peristiwa lainnya. Ini mendefinisikan dan mengaktifkan penangan yang akan dijalankan ketika shell menerima sinyal atau kondisi khusus lainnya.
Jika sigspec adalah 0 atau EXIT , arg dieksekusi ketika shell keluar. Untuk memahaminya, tutup terminal & buka setelah mengedit
.bashrc
file baris berikut .Ctrl D mirip dengan
exit
perintah untuk keluar dari terminal.Jika Anda ingin Bash keluar setelah menerima sinyal INT, bahkan dalam mode interaktif, Anda dapat menambahkan yang berikut ke
~/.bashrc
:atau
sumber