4

動機

1 つのプログラムがデータを読み取って内部形式に転送し、もう 1 つのプログラムが内部形式を別のものに転送する、一対のプログラムを作成したいと考えています。演習として、パイプを使用せずにこれらのプログラム間の相互作用をコーディングしたいと思います。シグナルと共有メモリを使用するのが好きです。

私が欲しいもの

A が B を呼び出すプログラム A と B があります。

  1. プログラム A からメモリ ブロックを作成する
  2. プログラム A からプログラム B を呼び出し、メモリ ブロックの場所に関する情報を提供します。
  3. 両方のプログラムのメモリ ブロックを使用します。

より具体的には、A はカスタム ビデオ形式をデコードし、1 つの非圧縮フレームを共有バッファーに配置します。B はバッファから読み取り、それを出力ストリームにエンコードします。デコーダーは、約 500 MiB/秒のメモリ トラフィックである、1 秒あたり最大 100 フレームをデコードします。データを頻繁にコピーする必要があり、バッファが正確に大きくないため、パイプは遅いことが判明しました。

うまくいくと思うこと

私の考えはmmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)、共有メモリのセクションを作成するために使用することです。問題は、次のexecve(2)状態のマンページです。

メモリ マッピングは保持されません (mmap(2))。

では、そのメモリを他のプログラムと共有するにはどうすればよいでしょうか。両方の機能を 1 つのプログラムに入れ、fork代わりに使用する方が良いでしょうか?

4

1 に答える 1

5

*nix システムには、共有メモリ用の API がいくつかあります。

  • BSD: を使用しますmmap()。関連のないプロセス間でメモリを共有するには、メモリをファイルに関連付けます。MAP_ANONYMOUSおよびingを使用して、関連するプロセス間でメモリを共有することもできます(ただし、移植性のfork()ために必ず -1 を使用してください)。fd
  • システム V: (これを本当に嫌う人もいます) を使用shmget()して、共有メモリ領域への参照を作成/取得し、 経由でアタッチし、 経由shmat()でデタッチしshmdt()、 で削除のマークを付けshmctl()ます。一意である必要があるキーによって共有メモリ領域を識別します。
  • POSIX:返されたファイル記述子からshm_open()thenを使用します。mmap()
于 2012-09-15T17:41:05.123 に答える