Emulator terminal
Sisi master menggantikan garis (sepasang kabel TX / RX) yang masuk ke terminal.
Terminal menampilkan karakter yang diterima di salah satu kabel (beberapa di antaranya adalah karakter kontrol dan membuatnya melakukan hal-hal seperti memindahkan kursor, mengubah warna ...) dan mengirimkan pada kawat lain karakter yang sesuai dengan tombol yang Anda ketik.
Terminal emulator seperti xterm tidak berbeda kecuali bahwa alih-alih mengirim dan menerima karakter pada kabel, mereka membaca dan menulis karakter pada deskriptor file mereka ke sisi master. Begitu mereka telah menelurkan terminal slave, dan memulai shell Anda pada itu, mereka tidak lagi menyentuh itu. Selain meniru pasangan kawat, xterm juga dapat mengubah beberapa properti garis disiplin melalui deskriptor file ke sisi master. Misalnya, mereka dapat memperbarui atribut ukuran sehingga SIGWINCH dikirim ke aplikasi yang berinteraksi dengan slave pty untuk memberi tahu mereka tentang ukuran yang diubah.
Selain itu, ada sedikit kecerdasan di terminal / terminal emulator.
Apa yang Anda tulis ke perangkat terminal (seperti pty slave) adalah apa yang Anda maksud untuk ditampilkan di sana, apa yang Anda baca darinya adalah apa yang Anda ketikkan di sana, sehingga tidak masuk akal bagi emulator terminal untuk membaca atau menulis itu. . Mereka adalah orang-orang di ujung sana.
Garis disiplin tty
Banyak intelijen di dalam disiplin baris tty . Disiplin garis adalah modul perangkat lunak (yang berada di driver, di kernel) yang didorong di atas perangkat serial / pty yang berada di antara perangkat itu dan jalur / kabel (sisi master untuk pty).
Garis serial dapat memiliki terminal di ujung lainnya, tetapi juga mouse atau komputer lain untuk jaringan. Anda dapat melampirkan disiplin garis SLIP misalnya untuk mendapatkan antarmuka jaringan di atas perangkat serial (atau perangkat pty), atau Anda dapat memiliki disiplin garis tty . Disiplin garis tty adalah disiplin garis default setidaknya di Linux untuk perangkat serial dan pty. Di Linux, Anda dapat mengubah disiplin garis ldattach
.
Anda dapat melihat efek menonaktifkan disiplin tty line dengan mengeluarkan stty raw -echo
(perhatikan bahwa bash prompt atau aplikasi interaktif lainnya seperti vi
mengatur terminal dalam mode persis yang mereka butuhkan, jadi Anda ingin menggunakan aplikasi bodoh suka cat
mengalami hal itu). Kemudian, semua yang ditulis ke perangkat terminal slave membuatnya segera ke sisi master agar xterm dibaca, dan setiap karakter yang ditulis oleh xterm ke sisi master segera tersedia untuk dibaca dari perangkat slave.
Disiplin garis adalah tempat editor garis internal perangkat terminal diimplementasikan. Misalnya dengan stty icanon echo
(seperti default), ketika Anda mengetik a
, xterm menulis a
ke master, maka garis disiplin menggemakannya kembali (membuat a
tersedia untuk dibaca oleh xterm
untuk tampilan), tetapi tidak membuat apa pun tersedia untuk dibaca di sisi budak . Kemudian jika Anda mengetik backspace, xterm mengirim ^?
atau ^H
karakter, garis disiplin (seperti itu ^?
atau ^H
sesuai dengan pengaturan erase
garis disiplin) mengirim kembali pada master ^H
, space
dan ^H
untuk xterm
menghapusa
Anda baru saja mengetik di layarnya dan masih tidak mengirim apa pun ke aplikasi membaca dari sisi slave, itu hanya memperbarui buffer editor baris internal untuk menghapus yang a
telah Anda ketik sebelumnya.
Kemudian ketika Anda menekan Enter, xterm mengirim ^M
(CR), yang diubah garis disiplin pada input ke ^ J (LF), dan mengirimkan apa yang telah Anda masukkan sejauh ini untuk membaca di sisi budak (aplikasi membaca /dev/pts/x
akan menerima apa Anda mengetik termasuk LF, tetapi bukan a
sejak Anda menghapusnya), sementara di sisi master, ia mengirim CR dan LF untuk memindahkan kursor ke baris berikutnya dan awal layar.
Disiplin garis juga bertanggung jawab untuk mengirimkan SIGINT
sinyal ke grup proses latar depan terminal ketika menerima ^C
karakter di sisi master dll.
Banyak aplikasi terminal interaktif menonaktifkan sebagian besar fitur disiplin garis itu untuk mengimplementasikannya sendiri. Tetapi bagaimanapun juga, berhati-hatilah bahwa terminal ( xterm
) memiliki sedikit keterlibatan dalam hal itu (kecuali menampilkan apa yang diperintahkan untuk ditampilkan).
Dan hanya ada satu sesi per proses dan per perangkat terminal. Sesi dapat memiliki terminal pengendali yang melekat padanya tetapi tidak harus (semua sesi dimulai tanpa terminal sampai mereka membukanya). xterm
, dalam proses yang bercabang untuk mengeksekusi shell Anda biasanya akan membuat sesi baru (dan karena itu lepaskan dari terminal tempat Anda meluncurkan xterm
dari jika ada), buka yang baru /dev/pts/x
ditelurkannya, dengan cara menyambungkan perangkat terminal itu ke sesi baru. Kemudian akan menjalankan shell Anda dalam proses itu, sehingga shell Anda akan menjadi ketua sesi. Shell Anda atau shell interaktif apa pun dalam sesi itu biasanya akan menyulap dengan kelompok proses dan tcsetpgrp()
, untuk mengatur pekerjaan latar depan dan latar belakang untuk terminal itu.
Mengenai informasi apa yang disimpan oleh perangkat terminal dengan disiplin tty (serial atau pty) , itulah yang biasanya stty
ditampilkan dan diubah perintah. Semua konfigurasi disiplin: ukuran layar terminal, lokal, flag input output, pengaturan untuk karakter khusus (seperti ^ C, ^ Z ...), kecepatan input dan output (tidak relevan untuk ptys). Itu sesuai dengan tcgetattr()
/ tcsetattr()
fungsi yang di Linux memetakan ke TCGETS
/ TCSETS
ioctls, dan TIOCGWINSZ
/ TIOCSWINSZ
untuk ukuran layar. Anda mungkin berpendapat bahwa grup proses latar depan saat ini adalah informasi lain yang disimpan dalam perangkat terminal ( tcsetpgrp()
/ tcgetpgrp()
, TIOC{G,S}PGRP
ioctls), atau input atau buffer output saat ini.
Perhatikan bahwa informasi ukuran layar yang disimpan dalam perangkat terminal mungkin tidak mencerminkan kenyataan. Terminal emulator biasanya akan mengaturnya (melalui ioctl yang sama pada ukuran master) ketika jendelanya diubah ukurannya, tetapi ia dapat keluar dari sinkronisasi jika suatu aplikasi memanggil ioctl di sisi slave atau ketika ukurannya tidak ditransmisikan (dalam kasus koneksi ssh yang menyiratkan pty lain yang dihasilkan oleh sshd
jika ssh
mengabaikan SIGWINCH
misalnya). Beberapa terminal juga dapat ditanya ukurannya melalui urutan melarikan diri, sehingga aplikasi dapat menanyakannya seperti itu, dan memperbarui disiplin garis dengan informasi itu.
Untuk lebih jelasnya, Anda dapat melihat halaman manual termios
dan tty_ioctl
di Debian misalnya.
Untuk bermain dengan disiplin garis lain:
Tiru mouse dengan pseudo-terminal:
socat pty,link=mouse fifo:fifo
sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
xinput list # see the new mouse there
exec 3<> fifo
printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
Di atas, sisi master pty diakhiri oleh socat ke pipa bernama ( fifo
). Kami menghubungkan fifo itu ke proses (shell) yang menulis 0x87 0x0a 0x00 yang berarti protokol sistem mouse no button pressed, delta(x,y) = (10,0)
. Di sini, kita (shell) tidak meniru terminal, tetapi mouse, 3 byte yang kami kirim tidak dapat dibaca (berpotensi diubah) oleh aplikasi dari perangkat terminal (di mouse
atas adalah symlink yang dibuat oleh socat
beberapa /dev/pts/x
perangkat) , tetapi harus ditafsirkan sebagai peristiwa input mouse.
Buat antarmuka SLIP:
# on hostA
socat tcp-listen:12345,reuseaddr pty,link=interface
# after connection from hostB:
sudo ldattach SLIP interface
ifconfig -a # see the new interface there
sudo ifconfig sl0 192.168.123.1/24
# on hostB
socat -v -x pty,link=interface tcp:hostA:12345
sudo ldattach SLIP interface
sudo ifconfig sl0 192.168.123.2/24
ping 192.168.123.1 # see the packets on socat output
Di atas, kabel serial ditiru oleh socat
sebagai soket TCP di antara hostA dan hostB. Garis disiplin SLIP menginterpretasikan byte yang dipertukarkan melalui garis virtual itu sebagai paket IP enkapsulasi SLIP untuk pengiriman pada sl0
antarmuka.
cat /dev/ptmx &
yang membuka pty baru, tetapi kemudian tidak ada proses yang dapat saya temukan terkait dengannya, jadi bagaimana Anda menggunakannya? Kedua saya mencobaecho "1" >/dev/ptmx
, tetapi itu tidak berhasil ... Mengapa saya tertarik dengan ini? Karena sering menggunakan ketika seseorang terhubung dari jarak jauh melaluissh
(misalnya), Anda mendapatkanPTY allocation request failed
atauNo controlling tty: open /dev/tty
kesalahan, yang mencegah kontrol pekerjaan. Akan lebih baik untuk lebih memahami itu.pty
halaman manual Anda untuk detailnya.physical term
----tty
----bash
pada terminal, danpty(m)
----tty
----pty(s)
----bash
pada emulator terminal? Apakahtty
disiplin bertanggung jawab untuk menggemakan karakter di terminal fisik juga? 2. Apakah program emulator terminal yang terhubung ke keyboard / layar untuk mengelola input? 3. Menurut apa yang saya pahami, Anda mengatakan bahwa buffer garis dari perintah bash / semua input terminal dilakukan olehtty
disiplin garis alih-alih buffer I / O fungsi CI / O. Apakah ini benar?Sunting: Karena jawaban ini, saya menulis artikel khusus di blog saya, untuk orang-orang yang tertarik pada detail lebih lanjut.
Setelah banyak membaca, ini yang saya mengerti.
/dev/ptmx
tidak mengalokasikan bagian slave : itu mengalokasikan "pseudo terminal master part". / dev / ptmx bukan terminal pseudo master : ini adalah terminal pseudo master multiplexer . Itu telah dibuat dengan standar Unix98 PTY untuk menghindari kondisi balapan ketika mengalokasikan terminal pseudo ( sumber ).Bagian master (ptm) terminal pseudo tidak terwakili pada sistem file. Ini diwakili oleh deskriptor file.
Bagian slave (pts) diwakili oleh file di
/dev/pts/N
manaN
adalah angka.The Poin diperoleh dari PTM melalui panggilan berturut-turut
grandpt
,unlockpt
,ptsname
. ( Sumber )PTT mengganti driver AUR yang didedikasikan untuk berkomunikasi dengan perangkat, dan edisi baris. Jadi terminal ini tidak meniru terminal tetapi menyediakan fitur edisi garis , dan menyediakan cara untuk memvisualisasikan dan berkomunikasi dengan Poin. ( Sumber )
Berikut adalah grafik dari apa yang TTY terhubung ke perangkat keras
Dan di sini adalah grafik dari tty yang terhubung ke ptm
File ptm menangani argumen Ioctl yang berbeda (ISPTM, UNLKPT, TIOCREMOTE, TIOCSIGNAL) dari pada pts.
Proses berinteraksi dengan perangkat melalui tindakan yang dilakukan ke file virtual (baca, tulis, ioctl ..). File itu sendiri tidak ada dan driver menggunakan file untuk memicu tindakan ketika metode membaca atau menulis dipanggil. (Lihat Lampiran untuk informasi tentang driver)
TTY mendefinisikan cara yang tepat untuk berinteraksi dengannya. Proses menulis dan membaca dari perangkat dan mengharapkan perilaku yang sama terlepas dari jenis TTY apa yang diterapkan.
Poin berperilaku seperti driver TTY. Metode baca dan tulisnya digunakan untuk mengimplementasikan perilaku Driver TTY. Karena tidak ada perangkat nyata untuk mengirim data, sepasang stream dibuat dan ptm mengimplementasikan fungsi baca untuk membaca data yang dikirim oleh pts ke stream, dan fungsi tulis untuk mengirim data ke stream yang akan tersedia kapan Poin akan membacanya.
Ingat, file yang mewakili perangkat bukanlah file klasik, dan jika
xterm
ingin melihat apa yang telah ditulis ke file, itu tidak bisa hanya disebut terbuka dan membacanya, karena fungsi-fungsi ini memiliki perilaku yang sama sekali berbeda di sini.Saya rasa tidak, ID sesi didefinisikan oleh proses pertama yang melampirkan pts (umumnya bash), dan saya tidak melihat cara untuk membuat sesi lain dan melampirkannya ke pts yang sama. Mungkin alat seperti ini
socat
bisa melakukan ini?Poin menyimpan 2 kategori informasi tentang terminal yang berkomunikasi dengan: the
Terminfo
danTermcap
. Biasanya, banyak terminal emulator didasarkan pada perpustakaan yang mengelola informasi termcap untuk mereka (yang akan memberikan semua nilai kemampuan untuk meniru VTX100 misalnya). Contoh perpustakaan seperti itu adalah libvte . Sunting (lihat komentar Chazelas Stephane): Kemampuan terminal tidak disimpan oleh Poin.Pavilyun
sumber
Berikut adalah skema yang saya buat beberapa waktu lalu tentang cara
sshd
kerjanya. Itu tidak menyangkut pengoperasian disiplin lini dan hal-hal lain, tetapi ia menambahkan ilustrasi kehidupan nyata tentang siapa yang berinteraksi dengan apa:sumber
-T
, yang kata orang itu menonaktifkan alokasi terminal semu. mis:ssh -T emasculateur@localhost "sleep 10"
kemudianps aux|grep sleep
perlihatkan ini:emasculateur 21826 0.0 0.0 23032 3728 ? Ss 02:49 0:00 zsh -c sleep 10
Dalam kasus di mana bash menulisstdout
danstderr
? Saya harap pertanyaan saya masuk akal./dev/null
seperti daemon normal, tetapi tidak yakin. Lihat juga: serverfault.com/questions/593399/...nohup
atauscreen
/tmux
.man pts
mengatakan:Tentang
/dev/pts/X indexing
:setiap X adalah sesi yang Anda buka, Jadi budak harus mengindeks.
Tentang
TeteType (/dev/ttyN
):Itu konsol nyata telah dihasilkan oleh sistem boot Anda seperti
sysV
.Tentang Mengapa budak insted master: http://commons.wikimedia.org/wiki/File:Termios-script-diagram.png
sumber