POSIX文件描述符和C FILE的交互

ybu*_*ill 2 c posix file file-descriptor

我正在阅读POSIX规范,但无法完全理解文件描述符,文件描述和流如何相互作用。

FILE* f1 = fopen("a.txt", "r");
int fno = fileno(f1);
FILE* f2 = fdopen(fno, "r");

// is it true?
assert(fileno(f2) == fno);

// does it close only f1 or f2 too?
fclose(f1);
fgetc(f2); // valid?
Run Code Online (Sandbox Code Playgroud)

(问题在评论中。)

Ker*_* SB 5

C标准库为您提供了不透明的指针FILE*,一个文件句柄,您可以使用fopen()/ 进行操作fclose(),并使用fread()/进行访问fwrite()

POSIX提供了一个文件描述符的概念,它是整数。您可以使用open()/ 操纵它们close(),并使用read()/ 访问write()

对于FILE * fpPOSIX系统上的每个打开的文件句柄,都可以使用来获取基础文件描述符fileno(fp)。相反,对于现有文件描述符n,可以使用打开标准文件句柄fdopen(n)

换句话说,POSIX文件描述符是一个操作系统原语,用于实现 C标准io库。请注意,POSIX文件描述符还用作套接字的句柄。

您对的最后一次调用fgets()是未定义的,因为它fclose()使文件句柄无效,从而使它的基础文件描述符无效。fdopen()没有复制的文件描述符。