C でファイル記述子からファイル名を取得する

readlink を使用できます /proc/self/fd/NNN に ここで、NNN はファイル記述子です。これにより、ファイルを開いたときの名前が表示されますが、それ以降にファイルが移動または削除された場合は、正確でなくなる可能性があります (ただし、Linux では名前の変更を追跡できる場合もあります)。検証するには、stat 指定されたファイル名と fstat あなたが持っている fd、そして st_dev を確認してください および st_ino

もちろん、すべてのファイル記述子がファイルを参照しているわけではありません。それらについては、pipe:[1538488] などの奇妙なテキスト文字列が表示されます。 .実際のファイル名はすべて絶対パスになるため、どれがどれであるかを簡単に判断できます。さらに、他の人が指摘したように、ファイルはそれらを指す複数のハードリンクを持つことができます - これはそれが開かれたものだけを報告します。特定のファイルのすべての名前を見つけたい場合は、ファイル システム全体をトラバースするだけです。


Mac OS X でこの問題が発生しました。/proc はありません。 仮想ファイル システムであるため、受け入れられたソリューションは機能しません。

代わりに F_GETPATH があります fcntl のコマンド :

 F_GETPATH          Get the path of the file descriptor Fildes.  The argu-
                    ment must be a buffer of size MAXPATHLEN or greater.

したがって、ファイル記述子に関連付けられたファイルを取得するには、次のスニペットを使用できます:

#include <sys/syslimits.h>
#include <fcntl.h>

char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
    // do something with the file path
}

MAXPATHLENがどこだったか覚えていないので PATH_MAX と思ったら syslimits からでも問題ありません。


Windows では、GetFileInformationByHandleEx を使用して FileNameInfo を渡すと、ファイル名を取得できます。