TTYは、他のTTYと同じように使用できるファイルです。あなたはあなたの言語の標準のファイルオープンツールでそれらを開き、それらから読み書きすることができます。「通常の」ファイルとは異なる特別な動作がいくつかありますが、基本は同じです。最後に、いくつかの特別なケースについて説明しますが、最初は実験です。
通常の端末から直接行うことができる興味深いことの1つです。実行するtty
と、次のような行が出力されます。
/dev/pts/2
これは、端末が実行されているTTYデバイスです。その端末に何かを書き込むことができます。
$ echo Hello > /dev/pts/2
Hello
$
あなたはそれから読むことさえできます:
$ read X < /dev/pts/2
hello
$ echo $X
hello
$
(read X
shの「標準入力から行を変数Xに読み込む」コマンドです。<は、読み込みコマンドの標準入力として/ dev / pts / 2を使用することです。最初の「hello」を入力し、2番目を出力しました) 。
たとえば、screen
またはを使用して別のシェルを開くと、そのシェルでxterm
runを実行echo spooky > /dev/pts/2
して、元の端末にテキストを表示できます。他のコマンドも同じです。これはすべて、シェルがTTYであることを知らずにファイルを開くだけです。
これは非常に単純なCプログラムで、要求したことを実行し、1文字を/ dev / pts / 3に書き込み、そこから1バイトを読み取ります。
#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;
}
シェルまたはターミナルエミュレータに接続されている実際のTTYデバイスは、そこで興味深い動作をしますが、何かを取り戻す必要があります。
端末にアクセスするには、使用する許可が必要です。これらは、あなたが見ls -l
たり設定したりする標準的なファイル許可です。ファイルchmod
を開いて読み取るには読み取り許可が必要であり、書き込むには書き込み許可が必要です。端末をサポートするTTYは所有者になりますが、別のユーザーのTTYは所有しません。また、USBデバイスのTTYは、構成によって異なる場合があります。通常と同じ方法で権限を変更できます。
それと連携するプログラムを作成する限り、特別なことをする必要はありません。この例では、必要のないことの1つは、毎回ファイルを閉じて相手側にデータを読み取らせることです。TTYファイルはパイプラインのように機能し、入ってくるとデータを双方向にプッシュするだけです。 TTYにテキストを書いたとき、それはすぐに現れました、そして、それからそれを読んだとき、すでに私を待っているものは何もありませんでした。それはだていないデータがディスクに保存されます通常のファイルへの書き込みのように-それは他の側にすぐに渡される、または誰かがそれを読み込むまでメモリに保存されます。
デバイスが何かを言うのを待っている間に他のことを行うことができるように選択機能を使用することもできますが、データが届くのを待つだけであれば、ブロック読み取りを使用してOSに実行させることができますリフティング。
心に留めておくべきことの1つは、カーネルのバッファーサイズが制限されている可能性があることです。一度に大量のデータを書き込むと、意味のないブロッキングになってしまう可能性があります。それが問題になる可能性がある場合は、でノンブロッキングIOを使用してくださいopen("/dev/...", O_RDWR | O_NONBLOCK)
。原則はどちらの方法でも同じです。