2

親プロセスのパイプの一端にデータ (制御データ、アクセス情報など) を書き込むアプリケーションがあります。子プロセスでは、そのデータをそのまま読み込みたい。

親プロセスは、多くの場所で多くの write() 操作を実行します。データをバッファに読み込むには、データの長さを指定する必要があります

read(int fd, buffer, len).

私の問題は、親プロセスが毎回可変サイズのデータ​​を書き込むことです。では、子プロセスはどのようにしてデータの長さを知るようになったのでしょうか。

私は単一の文字を読み取って、それをバフに追加しようとしましたが、

char ch;
int n = 0;
while(n >= 0)
{
    n = read(int fd, ch, 1);
    *buff = ch; buff++;
}

しかし、それはそれを行う方法ではないようです

子プロセスで可変サイズのデータ​​を読み込む方法を教えてください。

4

3 に答える 3

4

ええ、あなたはそこにある最も古い質問の1つを尋ねました。何年にもわたって多くの答えが開発されてきました...

  • 行として編成されたフォーマット済みデータを書き込み、次に一度に1行を読み取り、そこにある限り多くのデータを解析します
  • バイナリデータを書き込みますが、最初にレコードタイプを書き込みます
  • 上記と同じですが、2つのレベルで、タイプフィールドを持つレコードにラップされたバイナリデータと、レコード長の単語が前に付いたすべてのデータを使用します。これにより、リーダーをレイヤーで構造化できます。下位のI / Oレイヤーは、レコードを簡単に読み取り、アプリケーション固有のロジックを担当する上位のレイヤーにレコードの長さを戻すことができます。
  • フォーマットされたデータを行に書き込みますが、先頭の識別子で「レコードタイプ」を識別します
  • 言語を作成し、そのためのパーサーを作成します。パーサーはおそらく入力をバイトごとのテキストとして読み取ります
  • データをXMLとして整理する
  • データをYAMLとして整理する
  • データをJSONとして整理する

これらの手法にはすべて共通点が1つあります。リーダーはエンコードの種類をすでに知っている必要があり、プログラムロジックを使用して、データをその構造に従って条件付きで読み取る準備をする必要があります。もちろん、XML、YAML、JSONを読み取ることができるライブラリはすでに作成されています。

于 2013-02-10T17:52:08.880 に答える
4

読み取り側でデコードできるフォーマット済みデータをパイプに配置する必要があります。つまり、出力されるデータを理解できるように、フォーマット/プロトコルを指定する必要があります。\nデータに合わせて、長さを指定したり、または\0文字で終わる行を使用したりできます。

于 2013-02-10T17:53:31.087 に答える
3

最も一般的で最も単純な 2 つの方法は、最初に長さを固定サイズで書き込むか、レコードが終了したことを示す特別なレコード ターミネータを使用することです。

于 2013-02-10T17:54:22.333 に答える