5

ファイル記述子があり、シグナルハンドラー内でファイルを閉じます。しかし、他の条件により、ファイルが以前に閉じられた可能性があります。ファイル記述子が c および linux で開いているファイルを指しているかどうかを確認する方法はありますか?

更新: ファイル記述子に関連付けられたファイル名を特定することは可能ですか? このようにして、fd がリサイクルされた場合、アプリはそれを検出できます。

4

3 に答える 3

5

ファイル記述子のようなファイル操作を実行してみてくださいlseek。返された場合-1。次に、ファイル記述子がすでに閉じられているerrnoかどうかを確認します。EBADF

lseek以下のように影響を受けない方法で行うようにしてください。

lseek(fd, 0, SEEK_CUR);

通常、プログラムで最初のファイルを開くときは、常にファイル記述子を として取得します3。このファイルを閉じた後、別のファイルを開こうとすると、 と同じファイル記述子が取得され3ます。常に利用可能な最小数を取得するためです。プログラムで多くのファイルを閉じて再度開く場合は、コードを改善してファイル記述子リストを追跡し、ファイルが閉じているかどうかを確認する必要があります。

于 2013-01-15T18:07:21.563 に答える
2

ファイル記述子のfd割り当て-1を閉じた後、後でテストfd-1て、既に閉じているかどうかを確認できます。


readlink()onを呼び出すことで、(有効な) ファイル記述子が参照するファイル名を検索できます/proc/<pid>/fd/<file descriptor>

于 2013-01-15T19:51:58.400 に答える
1

ファイルを開くと、常に使用可能な最小限のfdが割り当てられます。したがって、fdを閉じてから、コード内のどこかで別のファイルを開くと、同じfdをこの新しいファイルに簡単に再割り当てできます。したがって、ファイル記述子が閉じていることを確認する信頼できる方法はありません。これは、開いている別のファイルを指すことができるためです。

于 2013-01-15T18:20:42.853 に答える