Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
POSIX文件描述符与C文件的交互_C_File_Posix_File Descriptor - Fatal编程技术网

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()
。除了释放资源之外,我还预计缓冲会产生令人费解的影响。