查看此答案以获取文件描述符,并查看此答案以从文件描述符中获取文件名。在 Linux 上应该没问题(不确定其他操作系统)。
这是一个快速工作示例(在 Cygwin/Win7 下测试):
#include
#include
#include
int main()
{
int MAXSIZE = 0xFFF;
char proclnk[0xFFF];
char filename[0xFFF];
FILE *fp;
int fno;
ssize_t r;
// test.txt created earlier
fp = fopen("test.txt", "r");
if (fp != NULL)
{
fno = fileno(fp);
sprintf(proclnk, "/proc/self/fd/%d", fno);
r = readlink(proclnk, filename, MAXSIZE);
if (r < 0)
{
printf("failed to readlink\n");
exit(1);
}
filename[r] = '\0';
printf("fp -> fno -> filename: %p -> %d -> %s\n",
fp, fno, filename);
}
return 0;
}
输出:
fp -> fno -> filename: 0x80010294 -> 3 -> /tmp/test.txt