tty *デバイスの読み取り/書き込み方法


29

USB経由でコンピューターに情報を送信するデバイスがあります。アーチLinuxは、名前のファイル作成することによって、このデバイスを設定ttyUSB0中に/dev/。私はGTKtermこの着信情報を受信し、エミュレートされたターミナルウィンドウに表示するために使用してきました。

私の質問は、GTKtermこのttyUSB0ファイルの読み取り/書き込みを正確にどのように行うのか、そして同様の機能を実装する方法をどこから学ぶのか、ということです。つまり、最も基本的な形式では、文字をに書き込むにはどうすればよいのでしょうttyUSB0か、対照的に、バイトを受け取ってファイルに書き込むにはどうすればよいのでしょうか?


1
catを使用して読み取り、エコーで書き込みを試みてください。UNIXの「すべてはファイル」:)
dchirikov 14年

シリアルコンソールを開いてみてください。screenこれを行う、とすることができますminiterm
mikeserv

私はプログラム的なアプローチの観点から考えていました。これが真実であり、本当に簡単な場合(ファイルを開いて読み取るだけ)、前回から新しいデータが存在する場合、ファイルを連続的に開いて読み取り、閉じ、更新する無限ループを作成しますか?プログラムで開いている場合、「tty」デバイスがファイルに書き込もうとするとどうなりますか?
sherrellbc 14年

cmrr.umn.edu/~strupp/serial.html:open()、read()、write()、select()が役立つかもしれません。特別なことは何もないようです。
dchirikov 14年

@sherrellbc-スクリプトscreenおよび/またはminitermプログラムで作成できます。
mikeserv 14年

回答:


38

TTYは、他のTTYと同じように使用できるファイルです。あなたはあなたの言語の標準のファイルオープンツールでそれらを開き、それらから読み書きすることができます。「通常の」ファイルとは異なる特別な動作がいくつかありますが、基本は同じです。最後に、いくつかの特別なケースについて説明しますが、最初は実験です。

通常の端末から直接行うことができる興味深いことの1つです。実行するttyと、次のような行が出力されます。

/dev/pts/2

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

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

あなたはそれから読むことさえできます:

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

read Xshの「標準入力から行を変数Xに読み込む」コマンドです。<は、読み込みコマンドの標準入力として/ dev / pts / 2を使用することです。最初の「hello」を入力し、2番目を出力しました) 。

たとえば、screenまたはを使用して別のシェルを開くと、そのシェルでxtermrunを実行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)。原則はどちらの方法でも同じです。


sudo echo Hello > /dev/tty4デスクトップ環境にいるときに試してbash: /dev/tty4: Permission deniedいますが、tty4にログインしていない場合に取得できます。ただし、tty4にログインしている場合は、すべて正常に機能します。この理由は何ですか?
-Utku

@Utku、それは確かに、仮想端末での認証後に削除される何らかのパーミッションの問題です。ログインする前後にファイルのアクセス許可を確認してくださいls -l /dev/tty4
。– sherrellbc

1
その> /dev/tty4部分は、echo開始されsudoたサブプロセスの一部ではなくsudo、現在のユーザーによって実行されるプロセス自体の一部です。ルートの代わりに現在のユーザーのファイル許可が適用されます。
Robin479 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.