Daftar sinyal yang dihasilkan terminal (mis. Ctrl-C -> SIGINT)

31

Di mana saya dapat menemukan daftar lengkap kombinasi keyboard yang mengirim sinyal di Linux?

Misalnya:

  • Ctrl+ C- SIGINT
  • Ctrl+ \- SIGQUIT
Tom Hale
sumber
2
"Keyboard" tidak mengirim sinyal apa pun, disiplin garis tidak. Cari tahu apa itu disiplin garis, lalu baca man 1 stty.
Satō Katsura
@SatoKatsura Disiplin garis adalah jenis driver keyboard.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Tidak juga. Driver keyboard berurusan dengan scancode dan sejenisnya. Disiplin garis adalah sejenis lem tingkat yang lebih tinggi yang memberikan aplikasi tampilan terpadu atas banyak hal lain, seperti garis modem, adaptor USB-ke-seri, perangkat HID, dll.
Satō Katsura
@SatoKatsura Ini adalah bagian dari sistem operasi yang duduk di antara aplikasi dan keyboard. Dengan kata lain, itu adalah bagian dari driver keyboard. Dengan terminal perangkat keras (seperti vt100), itu satu-satunya transformasi input keyboard yang dilakukan oleh komputer sebagai lawan dari terminal itu sendiri.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

27

Garis disiplin Linux N_TTY hanya mengirim tiga sinyal berbeda: SIGINT, SIGQUIT, dan SIGTSTP. Secara default, karakter kontrol berikut menghasilkan sinyal:

  • Ctrl+ C- SIGINT
  • Ctrl+ \- SIGQUIT
  • Ctrl+ Z- SIGTSTP
Johan Myréen
sumber
Hmm, bagaimana dengan Ctrl-S dan Ctrl-Q? Apakah Anda punya referensi untuk ini?
Tom Hale
6
Tidak ada sinyal yang terlibat ketika Anda menekan Ctrl-S atau Ctrl-Q. Mereka hanya membatasi aliran karakter, mencegah mereka mencapai proses konsumsi. Akhirnya, ketika buffer terisi, proses produksi akan memblokir panggilan sistem tulis sampai Ctrl-Q menguraikan aliran. Perhatikan bahwa panggilan untuk menulis dapat diblokir walaupun tanpa Ctrl-S: jika proses penerimaan lambat untuk mengkonsumsi data yang dikirim kepadanya, misalnya karena menghabiskan sebagian besar waktunya memproses data yang sudah diterima alih-alih membaca data baru .
Johan Myréen
1
man stty | grep -C1 signaladalah salah satu sumber untuk ketiganya menjadi satu-satunya sinyal yang dihasilkan oleh terminal.
Tom Hale
@ TomHale ... Kecuali "sinyal kontrol modem" adalah sinyal listrik. :) Benar-benar, SIGINT, SIGQUITdan SIGTSTPadalah satu-satunya "biasa" sinyal yang dikirim oleh disiplin line. Pada BSD Anda juga memiliki hal-hal seperti SIGINFO, tetapi itu bukan standar.
Satō Katsura
8

Anda dapat menggunakannya sttyuntuk memeriksa atau mengubah karakter yang menghasilkan sinyal.

$ stty -a | grep -Ewoe '(intr|quit|susp) = [^;]+'
intr = ^C
quit = ^\
susp = ^Z

intr(interupsi) menghasilkan SIGINT, quitmenghasilkan SIGQUIT, susp(menangguhkan) menghasilkan SIGTSTP. stty -ajuga akan menampilkan hal-hal seperti start = ^Q; stop = ^S;dan erase = ^?(backspace), yang tidak mengirim sinyal tetapi memengaruhi lapisan terminal sebaliknya.

Plain sttyakan menampilkan pengaturan non-default dan mis. stty intr ^QAkan mengubah karakter interrupt ^Qsebagai gantinya ^C.

Saya pikir ^L(umpan form, halaman baru) bukan fitur terminal, tetapi karakter yang sering digunakan oleh aplikasi untuk meminta redraw view, memeriksa kembali ukuran jendela pada saat yang sama.

ilkkachu
sumber
1
^Lmemiliki arti berbeda untuk aplikasi yang berbeda. Pada kebanyakan cursesaplikasi berbasis (seperti vim, less, mutt, mc, dll) itu memaksa redraw lengkap (sehingga kembali memeriksa ukuran jendela), tetapi dalam kerang ( bashdll) itu hanya membersihkan layar. Tidak ada yang SIGWINCHterlibat.
Satō Katsura