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:
/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 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
atau xterm
, Anda dapat menjalankan run echo 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:
#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 -l
dan 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.