双方向機能はFreeBSD 2.2.6に追加され、popen()
MacOSで利用可能です。私は改行で区切られた文字列ストリームを書くCプログラムを持っていて、それを私が書いたPerlツールにパイプできるようにしたいです。リストSTDINはこれらのストリームを読み取り、バッファリングし、垂直に並べられた複数列形式でSTDOUTに書き込みます。
C プログラムでは、以下を使用します。
FILE *cols_pipe = popen("cols", "r+");
パイプを開き始めるリスト;
fprintf( cols_pipe, "%s\n", word );
改行で終わる各単語を列に送信します。
while ((getline(&line_buf, &line_buf_len, cols_pipe)) != -1) {
printf("%s", line_buf);
}
再読み込みし、書式が変更された行を印刷します。リスト。プログラムが中断されたとき、getline()
私はその理由に気づきました。リストSTDINでEOFが受信されていませんが、閉じます。上場管理(EOFを送信するために私が考えることができる唯一の方法)再読み込みを防ぐことができます。
確かに、リストすべての入力を読み出すまで出力書き込みを開始できません。
これを達成する方法について提案がありますか? Cプログラムはインタラクティブなので、単にコマンドラインから呼び出してSTDOUTをパイプで接続したくありません。リスト。
答え1
Perlプログラム(作成したとおり)はSTDINでEOFを要求し、これを達成する唯一の方法は入力パイプを閉じることであるため、これは適用されませんpopen()
。しかし、Perlコードがあるので、Aを定義するコマンドオプションを追加することを検討することができます。 「入力の終わり」を表す特別なマーカーは「heredocs」の偉大な伝統に非常に従うので、入力ストリームの終わりを認識し、入力パイプを閉じることなく応答を開始できます。