Jika Anda menjalankan terminal dan memanggil yang dapat dieksekusi (dengan asumsi yang berorientasi garis untuk kesederhanaan), Anda mendapatkan balasan untuk perintah dari yang dapat dieksekusi. Bagaimana ini bisa dicetak kepada Anda (pengguna)? Apakah terminal melakukan sesuatu seperti pexpect
? (polling menunggu output) atau apa? Bagaimana cara mendapat pemberitahuan tentang hasil yang akan dicetak? Dan bagaimana terminal memulai program? (Apakah itu mirip dengan os.fork python?) Saya bingung bagaimana terminal bekerja, saya telah bermain dengan beberapa emulator terminal dan saya masih belum mengerti bagaimana semua sihir ini bekerja. Saya melihat sumber konsole (kde) dan yakuake (mungkin menggunakan konsole) dan saya tidak bisa mendapatkan di mana semua keajaiban itu terjadi.
sumber
Jawaban:
Awalnya Anda baru saja terminal bodoh - pada awalnya sebenarnya teletypewriter (mirip dengan mesin tik listrik, tetapi dengan gulungan kertas) (karenanya / dev / tty - TeleTYpers), tetapi kemudian layar + keyboard-combo - yang baru saja mengirim kode kunci - yang hanya mengirim kode-kunci ke komputer dan komputer mengirim kembali perintah yang menulis surat pada terminal (yaitu terminal tanpa gema lokal, komputer harus memerintahkan terminal untuk menulis apa yang diketik pengguna pada terminal) - ini adalah salah satu alasan mengapa begitu banyak perintah Unix yang penting begitu singkat. Sebagian besar terminal dihubungkan dengan serial-line, tetapi (paling tidak) satu terhubung langsung ke komputer (seringkali ruangan yang sama) - ini adalah konsol. Hanya beberapa pengguna terpilih yang dipercaya untuk mengerjakan "konsol" (ini sering merupakan satu-satunya "terminal" yang tersedia dalam mode pengguna tunggal).
Kemudian ada juga beberapa terminal grafis (disebut "xterminals", tidak perlu bingung dengan
xterm
-program) dengan layar & kartu grafis layar, keyboard, mouse dan prosesor sederhana; yang bisa menjalankan X-server. Mereka tidak melakukan perhitungan sendiri, sehingga klien-X berlari di komputer yang terhubung dengan mereka. Beberapa hardisk, tetapi mereka juga bisa boot melalui jaringan. Mereka populer di awal 1990-an, sebelum PC menjadi sangat murah dan kuat."Terminal emulator" - "terminal-window" yang Anda buka dengan program-program seperti
xterm
ataukonsole
- mencoba meniru fungsi terminal bodoh tersebut. Juga program sepertiPuTTY
(Windows) meniru terminal.Dengan PC, di mana "konsol" (keyboard + layar) dan "komputer" lebih dari satu unit, Anda mendapat "terminal virtual" (di Linux, kunci Alt + F1 hingga Alt + F6) sebagai gantinya, tetapi ini juga meniru terminal gaya lama. Tentu saja, dengan Unix / Linux menjadi lebih dari sistem operasi desktop yang sering digunakan oleh pengguna yang menghanguskan, Anda sekarang melakukan sebagian besar pekerjaan Anda "di konsol", di mana pengguna sebelumnya menggunakan terminal yang dihubungkan oleh serial-line.
Tentu saja shell yang memulai program. Dan ia menggunakan fork-systemcall (bahasa C) untuk membuat salinan dirinya dengan lingkungan-setting, maka exec-systemcall digunakan untuk mengubah salinan ini menjadi perintah yang ingin Anda jalankan. Shell menangguhkan (kecuali perintah dijalankan di latar belakang) sampai perintah selesai. Ketika perintah mewarisi pengaturan untuk stdin, stdout dan stderr dari shell, perintah akan menulis ke layar terminal dan menerima input dari keyboard terminal.
sumber
Ketika Anda "membuka terminal", Anda memulai program emulator terminal, seperti xterm, gnome-terminal, lxterm, konsole, ...
Salah satu hal pertama yang dilakukan emulator terminal adalah mengalokasikan terminal pseudo (sering juga disebut pseudo-tty, atau pty). Pty adalah sepasang file perangkat karakter : master pty, yang merupakan sisi yang dibuka emulator terminal, dan budak pty, yang merupakan sisi yang dibuka oleh program yang berjalan di dalam terminal. Pada kebanyakan unices modern, masternya
/dev/ptmx
(yang setiap emulator terminal terbuka) dan slave adalah/dev/pts/NUMBER
. Driver kernel untuk pseudo-terminal melacak proses yang mengontrol master untuk setiap perangkat slave. Emulator terminal dapat mengambil jalur ke slave yang sesuai melalui ioctl pada perangkat master.Setelah emulator terminal membuka perangkat master, ia memulai subproses (biasanya sebuah shell, tetapi terserah kepada pengguna yang memohon emulator terminal untuk memutuskan). Emulator melakukan ini dengan cara biasa untuk menjalankan program:
Ketika anak (atau proses lainnya) menulis ke budak pty, emulator melihat input pada master pty.
Sebaliknya, ketika emulator menulis ke perangkat master, itu terlihat sebagai input pada slave.
Harapkan bekerja dengan cara yang persis sama. Perbedaan antara Expect dan emulator terminal seperti xterm adalah di mana mereka mendapatkan input yang mereka beri makan program (skrip vs input keyboard) dan apa yang mereka lakukan dengan output (file log atau parser vs menggambar teks di jendela).
sumber
script
perintah BusyBox , di manaxgetpty
fungsi adalah inti dari pekerjaan/dev/ptmx
.