Bagaimana cara membaca / menulis ke perangkat tty *?


29

Saya memiliki perangkat yang mengirimkan informasi melalui USB ke komputer saya. Arch Linux set up perangkat ini dengan menciptakan sebuah file bernama ttyUSB0dalam /dev/. Saya telah menggunakan GTKtermuntuk menerima informasi yang masuk ini dan menampilkannya di jendela terminal yang ditiru.

Pertanyaan saya adalah, bagaimana tepatnya GTKtermmembaca / menulis ke ttyUSB0file 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?


1
Coba gunakan cat untuk membaca dan gema untuk menulis. "Semuanya adalah file" di unix :)
dchirikov

Anda dapat mencoba membuka konsol serial di atasnya. screendapat melakukan ini, danminiterm
mikeserv

Saya berpikir dalam hal pendekatan programatik. Jika ini benar dan itu sangat mudah (hanya dengan membuka dan membaca file), apakah Anda hanya akan menulis infinite loop untuk terus membuka, membaca, menutup file dan memperbarui ketika data baru hadir sejak waktu sebelumnya? Apa yang terjadi jika perangkat 'tty' mencoba menulis ke file jika Anda membukanya di program Anda?
sherrellbc

Mungkin bisa membantu: cmrr.umn.edu/~strupp/serial.html : open (), read (), write () dan pilih (). Sepertinya tidak ada yang istimewa.
dchirikov

@sherrellbc - Anda dapat membuat skrip screendan / atau secara minitermterprogram.
mikeserv

Jawaban:


38

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 ttydan itu akan mencetak garis seperti:

/dev/pts/2

Itu adalah perangkat TTY yang digunakan oleh terminal Anda. Anda dapat menulis sesuatu ke terminal itu:

$ echo Hello > /dev/pts/2
Hello
$

Anda bahkan dapat membacanya:

$ read X < /dev/pts/2
hello
$ echo $X
hello
$

( read Xis 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 screenatau xterm, Anda dapat menjalankan run echo spooky > /dev/pts/2di 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:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>    
int main() {
    char byte;
    int fd = open("/dev/pts/3", O_RDWR);
    write(fd, "X", 1);
    ssize_t size = read(fd, &byte, 1);
    printf("Read byte %c\n", byte);
    return 0;
}

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 -ldan atur dengan chmod: 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.


Saya mencoba sudo echo Hello > /dev/tty4ketika saya berada di lingkungan desktop tetapi saya dapatkan bash: /dev/tty4: Permission deniedjika saya tidak masuk ke tty4. Namun jika saya masuk ke tty4, semuanya berfungsi dengan baik. Apa alasannya?
Utku

@ Utku, Itu tentu saja semacam masalah izin yang dihapus setelah otentikasi dengan terminal virtual. Periksa izin file sebelum dan setelah Anda masuk.ls -l /dev/tty4
sherrellbc

1
yang > /dev/tty4bagian ist bukan bagian dari echosub proses dimulai oleh sudotetapi bagian dari sudoproses itu sendiri, yang dijalankan oleh pengguna saat ini. izin file untuk pengguna saat ini berlaku alih-alih root.
Robin479
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.