Pemahaman saya saat ini tentang sinyal dari keyboard di terminal (sebagian besar didasarkan pada upaya memetakan pengamatan saya ke apa yang dapat ditemukan di google) berikut:
- Pengguna menekan Cc
- Ini dikirim ke input buffer terminal sebagai byte yang dihitung dengan membersihkan 2 bit paling kiri dari 7 bit nilai ascii dari c
Setelah ini mulai benar-benar berkabut, karena konfigurasi input apa artinya sinyal apa yang dilakukan di terminal (stty). Saya kira itu berarti terminal itu sendiri mengirimkan sinyal ke proses. Tapi saya juga pikir terminal itu tidak tahu tentang aplikasi yang membacanya.
Bagaimana cara mengirim sinyal dengan keyboard di terminal bekerja dari ujung ke ujung?
Jawaban:
Menekan Csambil Ctrlditekan mengirimkan penekanan tombol diikuti oleh peristiwa rilis X11 ke emulator terminal.
Setelah peristiwa itu (umumnya yang menekan tombol), terminal emulator menulis byte 0x3 (
^C
) ke deskriptor file di sisi master perangkat pseudo-tty.Jika
isig
pengaturan termios perangkat aktif dan jikaintr
pengaturan diatur ke 0x3 byte itu, maka kernel mengirimkan sinyal SIGINT ke semua anggota kelompok proses latar depan perangkat terminal (atribut lain yang disimpan dalam perangkat pty). Dalam hal ini, byte 0x3 tidak akan tersedia untuk dibaca di sisi slave pty.Biasanya shell interaktif yang membuat grup proses (dengan
setpgid()
) untuk pekerjaan shell, dan memutuskan yang mana yang akan diletakkan di latar depan (dengantcsetpgrp()
mengatur atribut perangkat pty itu) atau tidak.Misalnya ketika Anda menjalankan prompt shell interaktif:
Shell memulai grup proses baru dengan dua proses (di mana ia mengeksekusi
foo
danbar
setelah menghubungkan stdin / out dengan pipa) dan menempatkan grup itu di latar depan. Kedua proses akan menerima SIGINT jika Anda menekan Ctrl-C.Di:
Sama tetapi grup proses tidak diletakkan di latar depan (dan shell juga tidak menunggu sehingga Anda dapat memasukkan perintah lain). Proses-proses itu tidak akan mendapatkan SIGINT pada Ctrl-C tetapi dapat ditangguhkan jika mereka mencoba membaca dari perangkat tty.
Lebih banyak membaca di: Apa tanggung jawab masing-masing komponen Pseudo-Terminal (PTY) (perangkat lunak, sisi master, sisi budak)?
sumber