転送を読み書きするTTYデバイス

転送https://feng-qi.github.io/2017/05/04/how-to-read-write-to-tty-device/

    <p>这是 StackExchange 上的一个问答,在这里翻译一下原文地址为:<br><a href="https://unix.stackexchange.com/questions/138342/how-to-read-write-to-tty-device" target="_blank" rel="noopener">How to read/write to tty* device?</a></p>

問題の説明

私は自分のコンピュータにUSB経由で情報を転送するようにデバイスを持っています。アーチのLinuxによる/dev/次のセットアップ
という名前のttyUSB0機器を設定するためのファイル。私が使用してきたGTKterm受信して表示で店舗情報を
アナログ端末ウィンドウ上。


私の質問は:GTKtermどのように特定の読み取り/書き込みttyUSB0ファイルを、どこから私は似て達成するために学ぶことができる
技術力を?これは最も単純なケースから、私はどのように文字を書くこと、であるttyUSB0、またはからそれを受け取る
ファイルに書き込まれたバイトと行きますか?


マイケル・ホーマーの答え

あなたは、TTYのファイルを使用して他のファイルを使用するようなことがあります。あなたが戦うために、ファイルの言語を開くために使用した一般的な方法を使用することができ
、それらを開き、読み書きをします。彼らは他の「通常」のファイルと比較され、そこにいくつかの特殊な動作がありますが、基本的には同じです。私は、
テキストの最後にいくつかの特別な例を話し、まだ実験、それをいくつか見ていきましょう。


あなたは、通常のターミナル面白いことで行うことができます実行することでtty、それを、それは次の出力のような行を出力します:


1
/ dev / PTS / 2

これは、あなたの端末がTTYデバイスを依存している、あなたはそのために何かを書くことができます実行されています。


1 
2
3
$エコーこんにちは>は/ dev / PTS / 2 
こんにちは
\(</ span>を<BR> </ PRE> </ TD> </ TR> </ TBODY> </ TABLE> </把握> <P>你甚至可以从它读取信息:</ P> <図クラス= "普通強調表示"> <TABLE> <TBODY> <TR> <TDクラス= "樋"> <PRE> <スパンクラス= "行"> 1 </スパン> <BR> <スパンクラス= "行"> 2 </スパン> <BR> <スパンクラス= "行"> 3 </スパン> <BR> <スパンクラス= "行"> 4 </スパン> <BR> <スパンクラス= "行"> 5 </スパン> <BR> </ PRE> </ TD> <TDクラス= "コード"> <PRE> <スパンクラス= "行"> \) Xを読み取ります<は/ dev / PTS / 2
ハロー
$エコー\(X </ span>の<BR> <スパンクラス=」ライン ">こんにちは</ span>の<BR> <スパンクラス=" 行 "> \)

read Xれるsh「標準入力から行を読み取り、変数Xに保存」するために使用されるコマンド、<指示/dev/pts/2
、読み出しコマンドなどの標準的な入力は、最初の「ハロー」タイプI、第2出力端子です)。


あなたが使用している場合screenxterm、別のシェルを開いて、あなたが新しくオープンしたシェルを実行することができ
echo spooky > /dev/pts/2、テキストは元のシェルに表示されます、他のコマンドに
同じであると言います。




以下は、あなたがやりたいことができますし、簡単なCプログラムです/dev/pts/3から、その後の文字を書き、
そこバイト、それを読んで:


1 
2
3
4
5
6
7
8
9
10
11
含める <stdio.hの>
含める <unistd.h>
含める <fcntl.h>
INT メイン() { char型のバイトと、INT FD =オープン("/ DEV / / 3のPTS" O_RDWR)。書き込み(FD、"X" 1); ssize_tの読み取りサイズ=(FD&バイト、1)。printf"バイト%のC \ nを読む"、バイト)。リターン0 ; }








シェルまたは端末エミュレータが、いくつかの興味深い行動を生み出す真のTTYデバイスにバインドされていますが、得ることができる必要があります
いくつかのフィードバックを(バック何かを得ます)。




私はあなたが適切な権限を持っている必要があり、端末にアクセスしたいです。これらは、単に標準のファイルアクセス権であり、あなたはそれを使用ls -l見ること
がありchmod、同じセット:あなたがファイルを開いて、それを読んで、それを書き込むための権限を記述するための権限を読む必要が。では
、あなたのTTY端末機の背面もあなたのものではなく、他の人、およびUSBデバイスに対応することもTTYに属していてもよいだろう
ことか、ご使用の構成に応じて、あなたに属していないかもしれません。あなたはいつものパーミッションを変更するには、同じメソッドを使用することができます。


限り、プログラムが正常な相互作用を記述することができて、あなたは特別な設定をする必要はありません。あなたがいることを例に見ることができ
、他の側はあなたが書いたデータを読み取るために、すべてのファイルを閉じるようにする必要がありません:TTYファイルを限り、パイプラインのように振る舞う
データはちょうど両端から渡されました。私はすぐに表示することができますTTYにテキストを書いたので、私は、後から読んだときときに
かかった時間は私を待っているデータがありません。これは、ディスクに保存された通常のファイルデータを書き込むようにされていません-
それは直接、もう一方の端に転送、またはそれが読み込まれるまでメモリに保存されます。


あなたは使用することがありますselect、それは場合は、もちろん、着信データ・デバイスのために待機して他のことを行うことができ、この機能を
使用すると、ちょうどあなたが道を遮断読み取るために使用できるデータの到着を待ち、およびオペレーティングシステムは、関連する操作を行うようにしたいですスケジューリング。


一つ心に留めておく必要があるが、カーネルのバッファサイズで、一度書いた場合も制限され、あまりにも多くのデータである
あなたが発生詰まらせたくない原因。これが問題であるならば、あなたは、非ブロッキングIOとして使用することができます
open("/dev/...",O_RDWR|O_NONBLOCK)どちらの方法でも原則は同じです。

</div>

おすすめ

転載: www.cnblogs.com/sdu20112013/p/11234365.html
おすすめ