GNU/Linux >> Belajar Linux >  >> Linux

Apa Tanggung Jawab Setiap Komponen Terminal-Pseudo (pty) (perangkat lunak, Sisi Master, Sisi Budak)?

Saya mencoba mencari tahu cara kerja tty (alur kerja dan tanggung jawab masing-masing elemen). Saya telah membaca beberapa artikel menarik tentangnya, tetapi masih ada beberapa bagian yang kabur.

Inilah yang saya pahami sejauh ini:

  • Terminal yang diemulasi membuat panggilan sistem yang berbeda ke /dev/ptmx , bagian utama dari terminal semu.
  • Bagian master dari terminal semu mengalokasikan file di /dev/pts/[0-N] , sesuai dengan port serial usang, dan “melampirkan” terminal pseudo budak ke port tersebut.
  • Terminal semu slave menyimpan informasi seperti ID sesi, tugas latar depan, ukuran layar.

Ini pertanyaan saya:

  1. Memiliki ptmx tujuan apa pun selain mengalokasikan bagian budak? Apakah itu memberikan semacam "kecerdasan" , atau terminal yang diemulasi
    (xterm misalnya) memiliki semua kecerdasan untuk berperilaku seperti terminal
    ?
  2. Mengapa xterm harus berinteraksi dengan bagian master, karena hanya meneruskan stdout dan stdin dari bagian budak? Mengapa tidak bisa
    langsung menulis dan membaca dari file pts ?
  3. Apakah ID sesi selalu dilampirkan ke satu file pts dan sebaliknya?
    Bisakah saya mengetikkan perintah ps dan menemukan 2 sessionId untuk yang sama
    /dev/pts/X
    ?
  4. Informasi lain apa yang dilakukan pts toko? Apakah Xterm memperbarui semua
    bidang sendiri, atau melakukan ptm menambahkan beberapa "kecerdasan" di atasnya?

Jawaban yang Diterima:

Emulator terminal

Sisi master menggantikan saluran (pasangan kabel TX/RX) yang menuju terminal.

Terminal menampilkan karakter yang diterimanya di salah satu kabel (beberapa di antaranya adalah karakter kontrol dan membuatnya melakukan hal-hal seperti memindahkan kursor, mengubah warna…) dan mengirimkan karakter lain yang sesuai dengan tombol yang Anda ketik di kabel lain.

Emulator terminal 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. Setelah mereka menelurkan terminal budak, dan memulai shell Anda pada itu, mereka tidak lagi menyentuhnya. Selain meniru pasangan kawat, xterm juga dapat mengubah beberapa properti disiplin baris melalui deskriptor file tersebut ke sisi master. Misalnya, mereka dapat memperbarui atribut ukuran sehingga SIGWINCH dikirim ke aplikasi yang berinteraksi dengan slave pty untuk memberi tahu mereka tentang perubahan ukuran.

Selain itu, ada sedikit kecerdasan di terminal/terminal emulator.

Apa yang Anda tulis ke perangkat terminal (seperti budak pty) adalah apa yang Anda maksud untuk ditampilkan di sana, apa yang Anda baca darinya adalah apa yang telah Anda ketik di sana, jadi tidak masuk akal bagi emulator terminal untuk membaca atau menulisnya. . Merekalah yang berada di ujung sana.

Disiplin garis tty

Banyak kecerdasan berada di disiplin garis tty . Disiplin baris adalah modul perangkat lunak (berada di driver, di kernel) yang didorong di atas perangkat serial/pty yang berada di antara perangkat itu dan jalur/kawat (sisi master untuk pty).

Saluran serial dapat memiliki terminal di ujung yang lain, 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 tty disiplin garis. Disiplin baris tty adalah disiplin baris default setidaknya di Linux untuk perangkat serial dan pty. Di Linux, Anda dapat mengubah disiplin baris dengan ldattach .

Anda dapat melihat efek menonaktifkan disiplin baris tty dengan mengeluarkan stty raw -echo (perhatikan bahwa bash prompt atau aplikasi interaktif lainnya seperti vi atur terminal dalam mode yang tepat yang mereka butuhkan, jadi Anda ingin menggunakan aplikasi bodoh seperti cat untuk mengalaminya).
Kemudian, semua yang ditulis ke perangkat terminal slave membuatnya segera ke sisi master untuk dibaca xterm, dan setiap karakter yang ditulis oleh xterm ke sisi master segera tersedia untuk dibaca dari perangkat budak.

Terkait:Bagaimana cara mendapatkan penyelesaian bash untuk alias perintah?

Disiplin garis adalah tempat editor saluran internal perangkat terminal diimplementasikan. Misalnya dengan stty icanon echo (seperti default), saat Anda mengetik a , xterm menulis a ke master, lalu garis disiplin bergema kembali (membuat a tersedia untuk dibaca oleh xterm untuk tampilan), tetapi tidak membuat apa pun tersedia untuk dibaca di sisi slave. Kemudian jika Anda mengetik backspace, xterm mengirimkan ^? atau ^H karakter, disiplin garis (seperti itu ^? atau ^H sesuai dengan erase pengaturan disiplin baris) mengirimkan kembali ^H . pada master , space dan ^H untuk xterm untuk menghapus a Anda baru saja mengetik di layarnya dan masih tidak mengirim apa pun ke aplikasi yang membaca dari sisi slave, itu hanya memperbarui buffer editor baris internal untuk menghapus a itu Anda telah mengetik sebelumnya.

Kemudian ketika Anda menekan Enter, xterm mengirimkan ^M (CR), yang diubah oleh disiplin baris pada input menjadi ^J (LF), dan mengirimkan apa yang telah Anda masukkan sejauh ini untuk dibaca di sisi slave (aplikasi membaca di /dev/pts/x akan menerima apa yang Anda ketik termasuk LF, tetapi bukan a karena Anda telah menghapusnya), sementara di sisi master, ia mengirimkan CR dan LF untuk memindahkan kursor ke baris berikutnya dan awal layar.

Disiplin baris 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 menerapkannya 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 pengontrol yang terpasang padanya tetapi tidak harus (semua sesi dimulai tanpa terminal sampai mereka membukanya). xterm , dalam proses yang dipaksa untuk mengeksekusi Shell Anda biasanya akan membuat sesi baru (dan karenanya terlepas dari terminal tempat Anda meluncurkan xterm dari jika ada), buka /dev/pts/x baru itu telah muncul, dengan melampirkan perangkat terminal itu ke sesi baru. Ini kemudian akan mengeksekusi shell Anda dalam proses itu, sehingga shell Anda akan menjadi pemimpin sesi. Shell Anda atau shell interaktif apa pun dalam sesi itu biasanya akan disulap dengan grup proses dan tcsetpgrp() , untuk menyetel tugas latar depan dan latar belakang untuk terminal tersebut.

Mengenai informasi apa yang disimpan oleh perangkat terminal dengan disiplin tty (serial atau pty) , itu biasanya stty perintah menampilkan dan memodifikasi. Semua konfigurasi disiplin:ukuran layar terminal, lokal, flag output input, pengaturan untuk karakter khusus (seperti ^C, ^Z…), kecepatan input dan output (tidak relevan untuk ptys). Itu sesuai dengan tcgetattr() /tcsetattr() fungsi yang di peta Linux 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 di perangkat terminal (tcsetpgrp() /tcgetpgrp() , TIOC{G,S}PGRP ioctls), atau buffer input atau output saat ini.

Perhatikan bahwa informasi ukuran layar yang disimpan dalam perangkat terminal mungkin tidak mencerminkan kenyataan. Emulator terminal biasanya akan menyetelnya (melalui ioctl yang sama pada ukuran master) saat jendelanya diubah ukurannya, tetapi bisa tidak sinkron jika aplikasi memanggil ioctl di sisi slave atau saat pengubahan ukuran tidak dikirimkan (dalam kasus dari koneksi ssh yang menyiratkan pty lain yang dihasilkan oleh sshd jika ssh mengabaikan SIGWINCH misalnya). Beberapa terminal juga dapat dikueri ukurannya melalui escape sequence, sehingga aplikasi dapat menanyakannya seperti itu, dan memperbarui disiplin baris dengan informasi tersebut.

Terkait:Debian – efek pengaturan bit yang tidak dapat diubah pada partisi /boot?

Untuk lebih jelasnya bisa dilihat di termios dan tty_ioctl halaman manual di Debian misalnya.

Untuk bermain dengan disiplin garis lain:

  1. Meniru mouse dengan terminal semu:

    socat pty,link=mouse fifo:fifosudo inputattach -msc mouse # menyetel disiplin baris MOUSE dan menentukan daftar protokolxinput # lihat mouse baru di sanaexec 3<> fifoprintf '20712
    
Linux
  1. Apa itu Pemisah Kata Readline?

  2. Apa Hubungan Antara Terminal Pengontrol Saat Ini Dan `/ dev/tty`?

  3. Bagaimana cara kerja *nix pseudo-terminal? Apa saluran master/budak?

  1. Gunakan terminal Linux untuk melihat file apa yang ada di komputer Anda

  2. Menghitung Karakter Setiap Baris Dengan Wc?

  3. Apa default GCC menyertakan direktori?

  1. Fedora vs Ubuntu:Apa perbedaan utama?

  2. Apa manfaat CloudLinux?

  3. Apa Mode Ikatan Jaringan Di CentOS / RHEL