POSIX文件描述符与C文件的交互
我正在阅读,无法完全理解文件描述符、文件描述和流是如何相互作用的POSIX文件描述符与C文件的交互,c,file,posix,file-descriptor,C,File,Posix,File Descriptor,我正在阅读,无法完全理解文件描述符、文件描述和流是如何相互作用的 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? (问题在评论中。)是的,这是真的,它会关
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?
(问题在评论中。)是的,这是真的,它会关闭两个文件,因为它们使用相同的文件描述符。C标准库为您提供不透明指针
文件*
,一个文件句柄,您可以使用fopen()
/fclose()
,并使用fread()
/fwrite()
进行访问
POSIX提供了文件描述符的概念,即整数。您可以使用open()
/close()
操作这些操作,并使用read()
/write()
访问这些操作
对于POSIX系统上每个打开的文件句柄file*fp
,可以使用fileno(fp)
获取底层文件描述符。相反,对于现有文件描述符n
,可以使用fdopen(n)
打开标准文件句柄
换句话说,POSIX文件描述符是用于实现C标准io库的操作系统原语。请注意,POSIX文件描述符还充当套接字的句柄
对
fgets()
的最后一次调用未定义,因为fclose()
会使文件句柄及其底层文件描述符无效fdopen()
不会复制文件描述符。但是第二个f2
如何被释放(文件结构)?我想我再也不能在上面调用fclose(f2)
了,对吧?嗯,我不知道;-)可能fdopen
分配要释放的新文件
对象,但是关闭它有点太晚了。我想你仍然需要调用fclose
,尽管它可能会失败。我建议不要使用文件对象指向同一描述符。如果确实需要,请复制文件句柄。与fdopen(dup(fileno(f1))类似,…)
f2
不会被释放。相反,它只是包含一个已关闭的过时文件描述符。如果尝试使用f2
您的应用程序将崩溃(返回错误)——假设您尚未打开具有相同文件描述符的另一个文件。不要在同一个文件上混合使用标准C IO和POSIX IO,这会导致痛苦。:)这是否意味着我最多可以在每个文件描述符上调用一次fdopen
?如果其他一些file*
也在使用该文件描述符,那么您甚至不能可靠地调用一次fdopen()
,因为您只能在两个file*
中的一个上可靠地调用fclose()
;您无法在第二个屏幕上可靠地使用fclose()
。如果您在使用fdopen()
之前使用了dup()
或者dup2()
,您可以在文件描述符用完之前尽可能频繁地使用fdopen()
。除了释放资源之外,我还预计缓冲会产生令人费解的影响。