tty*デバイスをどのように読み書きするのですか?

tty*デバイスをどのように読み書きするのですか?

USB経由でマイコンピュータに情報を送信するデバイスがあります。 Arch Linuxは、これらの受信メッセージを受信し、これをシミュレートされた端末ウィンドウに表示するために使用したというttyUSB0コマンドを生成してこれを実行します。/dev/GTKterm

私の質問は、GTKtermこのttyUSB0ファイルを正確にどのように読み書きできるか、そしてこのようなものを実装する方法をどこで学ぶことができるかです。つまり、最も基本的な形式でどのように文字を書くか、逆にバイトをttyUSB0受け取り、ファイルに書きますか?

ベストアンサー1

TTYは他のファイルと同様に使用できるファイルです。その言語の標準ファイルを開くツールを使用して、ファイルを開いて読み書きすることができます。 「一般」ファイルとは異なる特別な動作がありますが、基本原則は同じです。最後にいくつかの特別なケースを扱いますが、まず実験をしてみましょう。

一般端末で直接できる興味深いことがあります。実行すると、tty次の行が印刷されます。

/dev/pts/2

これは端末が実行されているTTYデバイスです。この端末に何かを書くことができます:

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

以下から読むこともできます。

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

read Xshの「標準入力から変数として1行読みます)。

screenたとえば、またはを使用して別のシェルを開くと、そのxtermシェルでrunを実行して元の端末にテキストが表示されるようにすることができます。echo spooky > /dev/pts/2他のコマンドでも同様です。これはすべて、シェルがファイルがTTYであるかどうかを知らずにファイルを開くことです。


以下は、要求された操作を実行し、/dev/pts/3に単一の文字を書き、次に1バイトを読み取る非常に単純なCプログラムです。

#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にテキストを書くとすぐに現れ、後で読むと待つことは何もありません。それいいえ通常のファイルへの書き込みと同様に、データはディスクに保存されます。すぐにもう一方の端に転送されるか、誰かが読み取るまでメモリに保存されます。

使いたいかもしれません選ぶ機能を使用すると、デバイスが通信するのを待っている間に他の操作を実行できますが、データが転送されるのを待つことを望む場合は、ブロック読み取りを使用してオペレーティングシステムに持ち上げ操作を実行させることができます。

注意すべき1つのことは、カーネルのバッファサイズが制限される可能性があり、一度に大量のデータを書き込むと意図せずブロックされる可能性があることです。これが問題になる可能性がある場合は、以下を使用してください。非遮断IOそしてopen("/dev/...", O_RDWR | O_NONBLOCK)。どちらの原則も同じです。

おすすめ記事