ファイル記述子があり、シグナルハンドラー内でファイルを閉じます。しかし、他の条件により、ファイルが以前に閉じられた可能性があります。ファイル記述子が c および linux で開いているファイルを指しているかどうかを確認する方法はありますか?
更新: ファイル記述子に関連付けられたファイル名を特定することは可能ですか? このようにして、fd がリサイクルされた場合、アプリはそれを検出できます。
ファイル記述子のようなファイル操作を実行してみてくださいlseek
。返された場合-1
。次に、ファイル記述子がすでに閉じられているerrno
かどうかを確認します。EBADF
lseek
以下のように影響を受けない方法で行うようにしてください。
lseek(fd, 0, SEEK_CUR);
通常、プログラムで最初のファイルを開くときは、常にファイル記述子を として取得します3
。このファイルを閉じた後、別のファイルを開こうとすると、 と同じファイル記述子が取得され3
ます。常に利用可能な最小数を取得するためです。プログラムで多くのファイルを閉じて再度開く場合は、コードを改善してファイル記述子リストを追跡し、ファイルが閉じているかどうかを確認する必要があります。
ファイル記述子のfd
割り当て-1
を閉じた後、後でテストfd
し-1
て、既に閉じているかどうかを確認できます。
readlink()
onを呼び出すことで、(有効な) ファイル記述子が参照するファイル名を検索できます/proc/<pid>/fd/<file descriptor>
。
ファイルを開くと、常に使用可能な最小限のfdが割り当てられます。したがって、fdを閉じてから、コード内のどこかで別のファイルを開くと、同じfdをこの新しいファイルに簡単に再割り当てできます。したがって、ファイル記述子が閉じていることを確認する信頼できる方法はありません。これは、開いている別のファイルを指すことができるためです。