私のプロジェクトの1opendir()
つでは、LD_PRELOADを使用してクライアントプログラムの呼び出しが介入され、その処理のためにファイルサーバーに送信されます(呼び出す前にサーバーにログインしますopendir()
)。したがって、呼び出しはソケットを通過します。opendir()
次に、サーバーからソケットを介してクライアントにDIR構造体(呼び出しから返される)へのポインターを返すにはどうすればよいですか。文字列に変換して送信しますか?
1 に答える
6
クライアントとサーバーは、同じマシン上にある場合でも、アドレス空間が異なります。したがって、ソケットを介してポインターを送信し、反対側で意味のあることを期待することはできません。
このようなことを行う有効な方法の 1 つは、共有メモリ セクションに構造体を配置し、オフセットを共有メモリ領域に送信することです。明らかに、クライアントとサーバーが同じ物理マシン上にある場合にのみ機能します。
EDIT:
そして、これはデータの読み取りには機能しますが、(明らかに)関数の呼び出しclosedir
や、他のプロセスからのメモリの解放に注意する必要があります。そのようなことは、ほぼ確実にひどく不運を意味します(つまり、あなたは死ぬでしょう)。
クライアントとサーバーが異なるマシン上にある「通常の」ケースでは、そのようなことを行う方法はまったくありません。もちろん、文字列データまたはシリアル化されたデータは問題なく送信できますが、ポインターなどは送信できません。
于 2011-07-22T11:37:50.793 に答える