Menurut pengetahuan saya, /dev/pts
file dibuat untuk sesi ssh atau telnet.
tty
.
Menurut pengetahuan saya, /dev/pts
file dibuat untuk sesi ssh atau telnet.
tty
.
Jawaban:
Tidak ada yang disimpan di /dev/pts
. Sistem file ini hidup murni di memori.
Entri dalam /dev/pts
adalah pseudo-terminal (pty). Kernel Unix memiliki gagasan umum tentang terminal . Terminal menyediakan cara bagi aplikasi untuk menampilkan output dan menerima input melalui perangkat terminal . Suatu proses mungkin memiliki terminal pengendali - untuk aplikasi mode teks, ini adalah bagaimana ia berinteraksi dengan pengguna.
Terminal dapat berupa terminal perangkat keras ("tty", kependekan dari "teletype") atau terminal semu ("pty"). Terminal perangkat keras terhubung melalui beberapa antarmuka seperti port serial ( ttyS0
, ...) atau USB ( ttyUSB0
, ...) atau melalui layar PC dan keyboard ( tty1
, ...). Pseudo-terminal disediakan oleh emulator terminal, yang merupakan aplikasi. Beberapa jenis terminal semu adalah:
Jika suatu program membuka terminal untuk menulis, output dari program itu muncul di terminal. Adalah umum untuk memiliki beberapa program yang mengeluarkan ke terminal pada saat yang sama, meskipun hal ini dapat membingungkan pada waktu-waktu tertentu karena tidak ada cara untuk mengetahui bagian mana dari keluaran yang berasal dari program mana. Proses latar belakang yang mencoba menulis ke terminal pengendali mereka dapat ditangguhkan secara otomatis oleh sinyal SIGTTOU .
Jika suatu program membuka terminal untuk membaca, input dari pengguna diteruskan ke program itu. Jika beberapa program membaca dari terminal yang sama, setiap karakter dialihkan secara independen ke salah satu program; ini tidak disarankan. Biasanya hanya ada satu program yang secara aktif membaca dari terminal pada waktu tertentu; program yang mencoba membaca dari terminal pengendali mereka ketika mereka tidak berada di latar depan secara otomatis ditangguhkan oleh sinyal SIGTTIN .
Untuk bereksperimen, jalankan tty
di terminal untuk melihat apa perangkat terminal itu. Katakan saja itu /dev/pts/42
. Dalam sebuah shell di terminal lain, jalankan echo hello >/dev/pts/42
: string hello
akan ditampilkan di terminal lain. Sekarang jalankan cat /dev/pts/42
dan ketik terminal lain. Untuk mematikan cat
perintah itu (yang akan membuat terminal lain sulit digunakan), tekan Ctrl+ C.
Menulis ke terminal lain kadang-kadang berguna untuk menampilkan pemberitahuan; misalnya write
perintah melakukan itu. Membaca dari terminal lain biasanya tidak dilakukan.
strace
input program membaca, tetapi hanya itu.
tostop
bendera tty diatur. Bendera ini tidak disetel secara default. Dan saya berdiri dikoreksi pada bacaan dari TTT anoter. Saya mencobanya dan itu berhasil, tapi ini berdasarkan per-baca, bukan per-karakter (ketika duduk di shell prompt mereka sama dengan shell membaca 1 karakter sekaligus). Mungkin baik untuk memperjelas hal ini karena sekarang saya menafsirkan jawaban Anda.
read
panggilan hanya akan mengembalikan karakter berturut-turut (atau lebih tepatnya byte, saya harus katakan), tetapi aplikasi tidak memiliki kontrol atas berapa byte read
panggilan akan kembali, jadi tidak lebih baik.
File dalam /dev/pts
adalah "pseudo-ttys". Mereka seperti pipa bernama sampai batas tertentu, tetapi mereka juga meniru terminal koneksi serial lama, seperti VT-100. Pseudo-ttys melakukan pekerjaan mentransfer byte dari keyboard ke program, dan dari program ke perangkat keluaran, yang terdengar sederhana. Tetapi itu menjawab pertanyaan eksplisitas Anda: kernel tidak menyimpan apa-apa /dev/pts/0
sebagai contoh. Hanya aliran byte dari stdout dari program yang terhubung ke pseudo-tty masuk, dan program yang stdin terhubung ke pseudo-tty yang sama membaca byte tersebut.
Pseudo-ttys juga menempatkan lapisan tipuan ke dalam aliran byte tersebut. Kernel dapat memeriksa byte untuk nilai-nilai khusus seperti "Control-C" atau "Control-D" atau "Control-U" (yang semuanya dapat dikonfigurasi, lihat man stty
) dan mengirim SIGINT, mengatur end-of-file pada stdin, atau menghapus baris pada input. Ada juga fungsi penyangga di sana, jadi "toko saya tidak ada" agak salah, tetapi hanya beberapa kilobyte.
Kernel dapat memeriksa nilai byte pada output dan melakukan hal-hal seperti mengubah baris baru (ASCII linefeed, LF atau "\n"
) menjadi dua byte, carriage-return dan linefeed (CRLF atau "\r\n"
), atau byte apa pun yang dibutuhkan perangkat keras terminal serial. Tipuan pseudo-tty memungkinkan independensi dari perangkat keras.
Pseudo-ttys juga memungkinkan semua "set baud rate", "set parity" dan sebagainya ioctl()
system calls, dan mungkin tidak melakukan apa-apa dengan mereka. Hal ini memungkinkan program yang ditulis kembali pada hari VT-100, ADM-3 dan Wyse apa pun tetap bekerja tanpa kesalahan. Perangkat lunak, driver perangkat pseudo-ttys, bertindak seperti perangkat keras.
Pseudo-ttys dapat digunakan oleh sshd
dan telnet
, tetapi mereka juga digunakan antara terminal emulator (seperti xterm
atau rxvt
) dan shell yang biasanya berjalan di dalam xterm.
Linux dan banyak Unix memiliki pseudo-ttys. Plan 9 tidak. Pseudo-ttys adalah sedikit peninggalan, yang tersisa dari zaman terminal perangkat keras yang terhubung dengan kabel serial.
/dev/
adalah direktori khusus untuk file perangkat. Ini adalah abstraksi, mereka bukan file nyata pada disk. Direktori diisi saat boot dan dapat berubah untuk mencerminkan antarmuka perangkat yang ada, yang dibuat dan dihancurkan oleh kernel dan daemon userspace udevd
,.
Banyak perangkat yang direpresentasikan adalah virtual. Ini termasuk entri di /dev/pts
, yang merupakan perangkat konsol. Inilah sebabnya mengapa dibuat untuk sesi jarak jauh; mereka juga dibuat ketika Anda membuka terminal GUI lokal.
Anda dapat membukanya sebagai file, meskipun tidak banyak menggunakan nilai. Untuk membuat /dev/pts
simpul shell Anda terhubung, gunakan tty
:
> tty
/dev/pts/4
Sekarang beralihlah ke konsol lain dan coba:
> echo "duck!" > /dev/pts/4
Pintar. Sekarang coba:
> cat /dev/pts/4
Kemudian coba dan gunakan shell di / dev / pts / 4. Anda terjebak sampai Anda keluar cat
dari sisi lain, tetapi sebagian besar dari apa yang Anda ketikkan pada Poin / 4 akan melewati (misalnya mencoba "halo dunia" saya berakhir dengan hl
pada Poin / 4 dan ello word
pada cat
konsol).
Dugaan saya di sini adalah bahwa perangkat mengambil input dari shell, dan mengeluarkannya melalui sistem, yang merupakan hal-hal yang muncul di layar - shell tidak berurusan dengan perangkat keras, sistemnya. Coba strace bash
(dan lihat man strace
apakah Anda tidak tahu apa itu); Anda mendapatkan kesibukan awal saat bash dimulai. Sekarang mulailah menekan tombol:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
Untuk setiap huruf yang diketik ada bacaan dari input standar dan write to standard out. Tapi apa standar shell yang terhubung? Sekarang coba strace
pada terminal GUI Anda - Anda harus mencari tahu nama jika Anda tidak mengetahuinya, misalnya pada KDE itu konsole
, dan GNOME memiliki gnome-terminal
, saya percaya. Output dari itu strace
mungkin lebih samar - milik saya punya banyak poll()
dan recvfrom()
. Saya tidak melihat ada tulisan, tetapi jika sekarang Anda menarik cat
trik dari terminal lain, Anda akan melihat ketika Anda mengetik, goresan kunci yang dibaca oleh kucing tidak menghasilkan respons sama sekali dalam output strace - terminal tidak t menerimanya. Jadi aplikasi terminal GUI dan kucing bersaing untuk membaca dari perangkat yang sama, yang menjadi keluaran shell.
echo Hello > /dev/pts/1
... Lihat apa yang terjadi, ini terminal Anda.