exec()で生成されたプロセスにポインターを渡す
質問
fork + execを使用して生成されたプロセスにポインター(mmapを使用してメモリにデータを含むファイルを入れています)を渡したいのですが、exec()生成プロセスにポインターを渡す方法に固執していますか?
UPDATE1:
入力のおかげで、私は共有メモリを使用して、MAP_INHERITフラグ付きのmmapで作成しました:
mmap()関数で作成された各マップファイルと共有メモリ領域 exec関数の呼び出しが成功することにより、マップされません MAP_INHERITオプションでマップされた領域。でマップされた領域 MAP_INHERITオプションは、新しいプロセスイメージにマップされたままです。
source: http:// www。 uwm.edu/cgi-bin/IMT/wwwman?topic=exec(2)&msection=
UPDATE2:
これは宿題の練習ですが、ポインタについて考えるのをやめて、IPC自体について考える必要があると思います。子プロセスで同じファイルをmmapしようとすると思う。
短いコード例に感謝します。
ご協力いただきありがとうございます。
解決
共有メモリを使用する場合、ポインタを渡すことはできません。ポインタには、プロセスごとに異なる仮想アドレスが含まれます。共有メモリ領域の開始に基づいて、オフセット値を交換する必要があります。
共有メモリを使用しない場合、どのような種類のポインタも交換できません。他のプロセスはプロセスのメモリにアクセスできません。
他のヒント
これは機能しません。新しいプロセスは、ファイル自体も mmap
する必要があります。
生成されたプロセスは、おそらく親プロセスに戻るパイプを開き、共有メモリセグメントをマップするために必要なデータを要求する必要があります。
あるいは、boost :: interprocessを使用して共有メモリセグメントを作成し、実際にアドレスを渡すことができます(マッピングを実行できます)。あなたは自分でそのドキュメントを読んでいます: http:/ /www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html
ファイル内のメモリへのオフセットを子プロセスに渡すことを検討してください。オフセットがゼロの場合、気にする必要はありませんが、ファイルの途中で「ポインター」を渡す必要がある場合は、それを開始アドレスからのオフセットに変換し、それを子に渡します。子は、マップされたファイル用に取得したアドレスにオフセットを追加することにより、データを取得できます。
コマンドライン引数または環境変数にテキストとして渡すだけです。
これは大きな領域であり、多くの選択肢があります。
これらのソリューションを見つけるための鍵は、 Linuxプロセッサ間通信または Linux IPC 。
IPCの紹介は、Advance Linux Programming(ISBN:0-7357-1043-0)などの書籍にも記載されています