私はあなたのための山の質問があります。ファイルから特殊文字列で始まるいくつかの行を抽出してファイルにコピーしようとしています。私は試した:
cat /dev/ttyACM0 | grep "something" > essai
ファイルが作成されましたが、内容はありません!
ベストアンサー1
効率のためにgrepや他のいくつかのコマンドを使用してください。バッファリングされた入力/出力つまり、一度に大きな塊にデータを読み込み(一度に1文字ではなく)、特定の量が累積するまでデータを出力しません(一度に1行または1文字を書くことはありません)。
ただし、プログラムの入力が端末(シリアルポートなど)から来る場合、オペレーティングシステムはプログラムを支援し、一度に1行ずつ返します。プログラムは端末を端末に配置してこれを実行できます。生のまたは非正規モード;ほとんどの人はそうではありません)。
プログラムを使用するとき標準入出力ライブラリ内の端末への標準出力(文書ではこれを「対話型デバイス」と呼びます)はデフォルトでラインバッファリングされますが、ファイルまたはパイプへの出力は完全にバッファリングされます。
stdio ライブラリを使用するプログラムは、コールを介して完全バッファリング、ラインバッファリング、またはバッファリングなしを選択できます。setvbuf
。また、電話することができますfflush
いつでも強制的に書くことができます。
GNU grepには--line-buffered
オプションが実行されます次のコード一致する行を出力する関数から:
if (line_buffered)
fflush (stdout);
すべての部分を1つにまとめる:
次のコマンドを使用します。
cat /dev/ttyACM0 | grep "something" > essai
cat
で一度に1行ずつ読みます/dev/ttyACM0
。数キロバイトの出力が蓄積された後、パイプに書き込まれます。読み取り数がゼロになるか失敗するまで(シリアルポートがオフラインになるまで発生しない可能性があります)、この操作を繰り返します。
grep
一度に数キロバイトずつパイプから読み取られ、数キロバイトの出力が累積された後にファイルに書き込まれますessai
。読み取り戻り回数がゼロになるか失敗するまで、この操作を繰り返します。cat
これはプロセスが終了すると発生します。
したがって、数キロバイトの一致する行が見つかるまで、essai
ファイルには何も表示されません。grep
出力をファイルにすばやく書き込むには、このオプションをGNU grepに提供できます。
grep --line-buffered < /dev/ttyACM0 > essai
シリアルポートから読み取られるためラインバッファリングされ、この--line-buffered
オプションを使用すると出力もラインバッファリングされます。