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.