1

私のプロジェクトの1opendir()つでは、LD_PRELOADを使用してクライアントプログラムの呼び出しが介入され、その処理のためにファイルサーバーに送信されます(呼び出す前にサーバーにログインしますopendir())。したがって、呼び出しはソケットを通過します。opendir()次に、サーバーからソケットを介してクライアントにDIR構造体(呼び出しから返される)へのポインターを返すにはどうすればよいですか。文字列に変換して送信しますか?

4

1 に答える 1

6

クライアントとサーバーは、同じマシン上にある場合でも、アドレス空間が異なります。したがって、ソケットを介してポインターを送信し、反対側で意味のあることを期待することはできません。

このようなことを行う有効な方法の 1 つは、共有メモリ セクションに構造体を配置し、オフセットを共有メモリ領域に送信することです。明らかに、クライアントとサーバーが同じ物理マシン上にある場合にのみ機能します。
EDIT:
そして、これはデータの読み取りには機能しますが、(明らかに)関数の呼び出しclosedirや、他のプロセスからのメモリの解放に注意する必要があります。そのようなことは、ほぼ確実にひどく不運を意味します(つまり、あなたは死ぬでしょう)。

クライアントとサーバーが異なるマシン上にある「通常の」ケースでは、そのようなことを行う方法はまったくありません。もちろん、文字列データまたはシリアル化されたデータは問題なく送信できますが、ポインターなどは送信できません。

于 2011-07-22T11:37:50.793 に答える