Bagaimana cara kerja terminal Linux?

32

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.

mikrofon
sumber
6
Lihatlah emulator terminal sederhana dan sistem operasi mainan sederhana dengan cangkang sederhana (dan sekitar lima belas halaman pertama dari bukunya). Baca juga jawaban ini untuk pertanyaan terkait.
2
Tautan ini juga bersinggungan
@nwildner cool,
mike
1
Lihat juga apa yang disimpan dalam file / dev / pts dan bisakah kita membukanya?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

30

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 xtermatau konsole- mencoba meniru fungsi terminal bodoh tersebut. Juga program seperti PuTTY(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.

Baard Kopperud
sumber
Dan di antara terminal seri bisu dan Xterms ada en.wikipedia.org/wiki/Blit_(computer_terminal)
sendmoreinfo
31

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:

  • garpu proses anak,
  • buka perangkat slave pty pada deskriptor file 0, 1 dan 2 (input standar, output standar dan aliran kesalahan),
  • jalankan shell atau program lain dalam proses anak.

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).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Salah satu contoh sederhana dari apa yang dijelaskan di sini adalah implementasi scriptperintah BusyBox , di mana xgetptyfungsi adalah inti dari pekerjaan /dev/ptmx.
Ruslan
@Tim Saya menghargai bahwa bahasa Inggris bukan bahasa ibu Anda. Tetapi jika Anda mengedit posting, maka pastikan Anda tidak membuat kesalahan. Jika Anda tidak memahaminya, jangan edit. Sekali lagi, jangan gunakan huruf tebal untuk menyoroti hal-hal yang tidak perlu disorot.
Gilles 'SO- stop being evil'