Saya memiliki perangkat yang mengirimkan informasi melalui USB ke komputer saya. Arch Linux set up perangkat ini dengan menciptakan sebuah file bernama ttyUSB0
dalam /dev/
. Saya telah menggunakan GTKterm
untuk menerima informasi yang masuk ini dan menampilkannya di jendela terminal yang ditiru.
Pertanyaan saya adalah, bagaimana tepatnya GTKterm
membaca / menulis ke ttyUSB0
file ini , dan di mana saya bisa mulai belajar bagaimana menerapkan fungsi serupa? Yaitu, dalam bentuk paling dasar, bagaimana saya bisa menulis karakter ke ttyUSB0
, atau, sebaliknya, menerima byte dan menulisnya ke file?
screen
dapat melakukan ini, danminiterm
screen
dan / atau secaraminiterm
terprogram.Jawaban:
TTY adalah file yang dapat Anda gunakan seperti yang lain. Anda dapat membukanya dengan alat pembuka file standar bahasa Anda dan membaca atau menulis darinya. Mereka memiliki beberapa perilaku khusus yang berbeda dengan file "biasa", tetapi dasarnya sama. Saya akan membahas beberapa kasus khusus di bagian akhir, tetapi pertama-tama, sebuah eksperimen.
Satu hal menarik yang bisa Anda lakukan langsung dari terminal reguler. Jalankan
tty
dan itu akan mencetak garis seperti:Itu adalah perangkat TTY yang digunakan oleh terminal Anda. Anda dapat menulis sesuatu ke terminal itu:
Anda bahkan dapat membacanya:
(
read X
is sh "membaca garis dari input standar ke dalam variabel X" perintah; <adalah menggunakan / dev / pts / 2 sebagai input standar untuk perintah baca; "halo" pertama yang saya ketikkan, dan yang kedua dicetak) .Jika Anda membuka shell lain, katakan dengan menggunakan
screen
atauxterm
, Anda dapat menjalankan runecho spooky > /dev/pts/2
di shell itu untuk membuat teks muncul di terminal asli Anda, dan hal yang sama untuk perintah lainnya. Semua ini hanyalah shell Anda membuka file tanpa mengetahui itu adalah TTY.Berikut adalah program C yang sangat sederhana yang hanya melakukan apa yang Anda minta, dan menulis satu karakter ke / dev / pts / 3, lalu membaca satu byte kembali darinya:
Perangkat TTY nyata yang melekat pada shell atau terminal emulator akan memiliki perilaku menarik di sana, tetapi Anda harus mendapatkan sesuatu kembali.
Untuk mengakses terminal, Anda harus memiliki izin untuk menggunakannya. Itu hanya izin file standar yang Anda lihat
ls -l
dan atur denganchmod
: Anda perlu izin baca untuk membuka file dan membacanya, dan menulis izin untuk menulis ke dalamnya. TTY yang mendukung terminal Anda akan dimiliki oleh Anda, tetapi TTY pengguna lain tidak akan melakukannya, dan TTY untuk perangkat USB mungkin atau mungkin tidak, tergantung pada konfigurasi Anda. Anda dapat mengubah izin dengan cara yang sama seperti biasa.Sejauh menulis sebuah program untuk bekerja dengannya, Anda tidak perlu melakukan banyak hal khusus. Anda dapat melihat dalam contoh bahwa satu hal yang tidak perlu Anda lakukan adalah menutup file setiap kali memiliki data Anda dibaca oleh ujung lain: file TTY bertindak seperti pipa, hanya mendorong data di kedua arah saat masuk. Ketika saya menulis teks ke TTY itu segera muncul, dan ketika saya membacanya setelah itu tidak ada apa pun yang menunggu saya. Ini tidak seperti menulis ke file biasa di mana data disimpan di disk - itu diteruskan segera ke sisi lain, atau disimpan dalam memori sampai seseorang membacanya.
Anda mungkin ingin menggunakan fungsi pilih sehingga Anda dapat melakukan hal-hal lain sambil menunggu perangkat mengatakan sesuatu, tetapi jika Anda senang hanya menunggu data masuk Anda bisa menggunakan pemblokiran pembacaan dan membiarkan OS melakukan mengangkat.
Satu hal yang perlu diingat adalah bahwa ada ukuran buffer yang terbatas di kernel, dan jika Anda menulis banyak data sekaligus, Anda mungkin berakhir dengan memblokir tanpa sengaja. Jika itu mungkin menjadi masalah, menggunakan non-blocking IO dengan
open("/dev/...", O_RDWR | O_NONBLOCK)
. Prinsipnya juga akan sama.sumber
sudo echo Hello > /dev/tty4
ketika saya berada di lingkungan desktop tetapi saya dapatkanbash: /dev/tty4: Permission denied
jika saya tidak masuk ke tty4. Namun jika saya masuk ke tty4, semuanya berfungsi dengan baik. Apa alasannya?ls -l /dev/tty4
> /dev/tty4
bagian ist bukan bagian dariecho
sub proses dimulai olehsudo
tetapi bagian darisudo
proses itu sendiri, yang dijalankan oleh pengguna saat ini. izin file untuk pengguna saat ini berlaku alih-alih root.