查看此答案以获取文件描述符,并查看此答案以从文件描述符中获取文件名。在 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