ソケットsys(libc)関数は、常に同じ引数に対して同じ結果を返す必要がありますか?

ソケットsys(libc)関数は、常に同じ引数に対して同じ結果を返す必要がありますか?

デフォルトでは、次のタスクを実行するC#アプリケーションを作成しています。リスト。ところで、移植に問題があります。IOCTL.NETに電話してください。私は、私がこれまでに書いたinteropコード(私の.NETアプリケーションがこの管理されていないシステムコードを呼び出せるようにするため)は、成功したioctl呼び出しを実行せず、常に-1をエラーとして返すことを意味します。 LinuxのVisual Studio Codeでiwlistをデバッグするときに常に呼び出しが表示されることを確認しました。ソケット(2,2,0) はファイル記述子 3 を返します。

まったく同じパラメータを使用して私のC#アプリケーションで同じ呼び出しを実行すると、200を超える範囲のファイル記述子が返されます。

iwlistへの追加のioctl呼び出しは、返されたソケットを入力パラメータとして使用するので、これがそれ自体が私の問題を示すかどうか疑問に思います。つまり、ソケットが開かれたときに元のiwlistコードが常にファイルディスクリプタ3を取得し、C#アプリケーションがファイルディスクリプタ3をインポートしないときに埋め込まれたC#iwlistコードが実行されると予想する必要がありますか?

ドキュメントから:

成功した呼び出しによって返されたファイル記述子は、現在プロセスに対して開かれていない最も低い番号のファイル記述子になります。

それでは、デバッグ時に常に同じファイル記述子を取得するのはなぜですか?

ベストアンサー1

新しいファイル記述子を返すほとんどのPOSIXライブラリ関数は、未使用の最小記述子番号を割り当てます。注目すべき例外の1つは、記述dup2子を特定の数値にコピーすることを目的とした関数です。dup2(old, new)new

socket記述子を返すためにいくつかのパラメータを使用して呼び出すループを作成し、その記述子を使用し、close他のスレッドが記述子を割り当てたり削除したりしない場合は、socket毎回同じ記述子番号を返す必要があります。

数字は毎回他のオブジェクトを参照します。これは、解放されたメモリ割り当てを再利用するのと似ています。

おすすめ記事