変数にファイル記述子が格納されているとしますvar
。後でその記述子が有効かどうかを確認するにはどうすればよいですか?
fdvar1= open(.....);
fdvar2 = fdvar1; // Please ignore the bad design
....
// lots of loops , conditionals and threads. It can call close(fdvar2) also.
....
if(CheckValid(fdvar1)) // How can I do this check ?
write(fdvar1, ....);
fdvar1
ここで、(まだ開かれた記述子を保持している) がまだ有効かどうかを確認したいと思います。そのための API はありますか?
ベストアンサー1
fcntl(fd, F_GETFD)
有効なオープン ファイル記述子であるかどうかを確認する標準的な最も安価な方法ですfd
。大量のバッチ チェックが必要な場合は、poll
タイムアウトを 0 に設定し、メンバーを 0 に設定して使用し、返された後にevents
チェックする方が効率的です。POLLNVAL
revents
そうは言っても、「特定のリソース ハンドルがまだ有効かどうかを確認する」という操作は、ほとんどの場合、根本的に間違っています。リソース ハンドルが解放された後 (たとえば、fd がclose
d の場合)、その値は、割り当てた次のリソースに再割り当てされる可能性があります。使用される可能性のある参照が残っている場合、それらは古いリソースではなく新しいリソースに対して誤って動作します。したがって、実際の答えはおそらく次のようになります。プログラムのロジックでまだわからない場合は、修正する必要がある重大な基本的なロジック エラーがあります。