TTY'ler, tıpkı diğerleri gibi kullanabileceğiniz dosyalardır. Bunları, dilinizin standart dosya açma araçlarıyla açabilir ve onlardan okuyabilir veya yazabilirsiniz. "Sıradan" dosyalardan farklı bazı özel davranışları var, ancak temelleri aynı. Sonunda bazı özel durumları ele alacağım, ama önce bir deney.
Normal bir terminalden yapabileceğiniz ilginç bir şey. Çalıştırın tty
ve şöyle bir satır yazdıracak:
/dev/pts/2
Bu, terminalinizin çalıştığı TTY cihazı. Bu terminale bir şeyler yazabilirsiniz:
$ echo Hello > /dev/pts/2
Hello
$
Hatta ondan okuyabilirsiniz:
$ read X < /dev/pts/2
hello
$ echo $X
hello
$
( read X
sh'ın "standart girdiden X değişkenine bir satır oku" komutudur; <okuma komutu için / dev / pts / 2 komutunu standart girdi olarak kullanmaktır; ilk "merhaba" yazdım ve ikincisi yazdırıldı) .
Başka bir kabuk açarsanız, screen
ya da ' yı kullanarak söyleyin , metnin orijinal terminalinizde görünmesini sağlamak için o kabukta xterm
koşabilirsiniz echo spooky > /dev/pts/2
, diğer komutlarda da aynıdır. Bütün bunlar sadece bir kabuğun bir TTY olduğunu bilmeden bir dosyayı açmasıdır.
İstediğiniz şeyi yapan ve / dev / pts / 3'e tek bir karakter yazan, sonra ondan tek bir bayt okuyan çok basit bir C programı:
#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;
}
Bir kabuk veya terminal emülatörüne bağlanan gerçek bir TTY cihazı, burada ilginç davranış sergileyecektir, ancak bir şeyi geri almalısınız.
Bir terminale erişmek için kullanmak için izniniz olması gerekir. Bunlar sadece gördüğünüz ls -l
ve birlikte ayarladığınız standart dosya izinleridir chmod
: dosyayı açmak ve okumak için okuma iznine ve yazmak için izin yazmanız gerekir. Terminalinizi destekleyen TTY'ler size ait olacak, ancak başka bir kullanıcının TTY'si olmayacak ve yapılandırmanıza bağlı olarak USB aygıtları için TTY'ler olabilir veya olmayabilir. İzinleri her zaman olduğu gibi değiştirebilirsiniz.
Onunla çalışmak için bir program yazarken, çok özel bir şey yapmanıza gerek kalmaz. Örnekte, yapmanız gerekmeyen bir şeyin , verilerinizin diğer ucundan okunması için her seferinde dosyayı kapatması olduğunu görebilirsiniz: TTY dosyaları, her iki yönde de olduğu gibi veri ileterek boru hatları gibi davranır. TTY'ye metin yazdığımda hemen belirdi ve daha sonra okuduğumda beni bekleyen hiçbir şey yoktu. O var olmayan veri diske kurtulur düzenli dosyaya yazmak gibi - bu diğer tarafa hemen geçti, ya da birisi onu okuyana kadar hafızada depolanır.
Seçim işlevini kullanmak isteyebilirsiniz, böylece cihazın bir şey söylemesini beklerken başka şeyler yapabilirsiniz, ancak verilerin gelmesini beklediğinizden memnunsanız, sadece blok okuyanları kullanabilir ve işletim sisteminin yapmasına izin verebilirsiniz. kaldırma.
Akılda tutulması gereken bir şey, çekirdekte sınırlı arabellek boyutu olabileceği ve bir kerede çok fazla veri yazarsanız, anlamsız bir şekilde engellemeye son verebileceğinizdir. Bu bir sorun olma ihtimali varsa, kullanmak IO olmayan engelleme ile open("/dev/...", O_RDWR | O_NONBLOCK)
. Prensip aynı şekilde olacaktır.