文件描述符和文件指针有什么区别?
我想知道文件描述符和文件指针之间的区别。
另外,在什么情况下你会使用一个而不是另一个?
文件描述符是一个低级整数“句柄”,用于在Linux和其他类Unix系统中在内核级识别打开的文件(或套接字,或其他)。
您将“裸”文件描述符传递给实际的Unix调用,例如read()
, write()
等。
FILE
指针是C标准的库级结构,用来表示文件。 FILE
包装文件描述符,并添加缓冲和其他function,使I / O更容易。
将FILE
指针传递给标准C函数,如fread()
和fwrite()
。
一个是缓冲( FILE *
),另一个不是。 实际上,除非您知道自己在做什么或者除非您的文件实际上是一个套接字,否则几乎总是在您从“真实”文件(即在驱动器上)读取数据时使用FILE *
。
您可以使用fileno()
从FILE *
获取文件描述符,并且可以使用fdopen()
从文件描述符中打开缓冲的FILE *
文件描述符只是从Posix的open()
调用中获得的整数。 使用标准的C fopen()
你会得到一个FILE
结构体。 FILE
结构包含这个文件描述符以及诸如文件结束和错误指示符,stream位置等。
因此,与open()
相比,使用fopen()
会提供一定的抽象。 一般来说,你应该使用fopen()
因为这更便于使用,你可以使用所有使用FILE
结构的其他标准C函数,即fprintf()
和family。
使用或者没有性能问题。
想要添加可能有用的分数。
关于FILE *
- 不能用于进程间通信(IPC)。
- 在需要通用缓冲I / O时使用它(printf,frpintf,snprintf,scanf)
-
我多次使用它debugging日志。 例,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
关于FILE DESCRIPTOR
-
它通常用于IPC。
-
对* nix系统(设备,文件,套接字等)的文件进行低级控制,因此比
FILE *
更强大。
文件描述符vs文件指针
文件描述符:
文件描述符是open()
系统调用返回的整数值。
int fd = open (filePath, mode);
- 低/内核级处理程序。
- 通过读取()和写入()UNIX系统调用。
- 不包括缓冲和这样的function。
- 便携性较差,效率不高。
文件指针:
文件指针是指向由fopen()
库函数返回的C结构的指针,用于标识文件,包装文件描述符,缓冲function以及I / O操作所需的所有其他function 。文件指针的types为FILE ,其定义可以在“/usr/include/stdio.h”中find。 这个定义可能因编译器而异。
FILE *fp = fopen (filePath, mode); // A FILE Structure returned by fopen typedef struct { unsigned char *_ptr; int _cnt; unsigned char *_base; unsigned char *_bufendp; short _flag; short _file; int __stdioid; char *__newbase; #ifdef _THREAD_SAFE void *_lock; #else long _unused[1]; #endif #ifdef __64BIT__ long _unused1[4]; #endif /* __64BIT__ */ } FILE;
- 它是高层次的接口。
- 传递给fread()和fwrite()函数。
- 包括缓冲,错误指示和EOF检测等。
- 提供更高的便携性和效率。
只是一个注意完成讨论(如果感兴趣)….
fopen
可能是不安全的,你应该使用fopen_s
或open
专用的位设置。 C1X提供x
模式,所以你可以fopen
模式"rx"
, "wx"
等。
如果您使用open
,则可以考虑open(..., O_EXCL | O_RDONLY,... )
或open(..., O_CREAT | O_EXCL | O_WRONLY,... )
。
例如,请参阅关于fopen()和文件创build的假设 。
当使用文本文件和用户input/输出时, FILE *
更加有用,因为它允许您使用sprintf()
, sscanf()
, fgets()
, feof()
等API函数。
文件描述符API是低级别的,所以它允许使用套接字,pipe道,内存映射文件(当然还有普通文件)。
系统调用主要是使用文件描述符,例如write
。 库函数将使用文件指针( printf
, scanf
)。 但是,库函数只使用内部系统调用。
在Unix和相关的计算机操作系统中,文件描述符(FD,less fildes fildes)是用于访问文件或其他input/输出资源(例如pipe道或networking套接字)的抽象指示符(句柄)。 文件描述符构成了POSIX应用程序编程接口的一部分。 文件描述符是一个非负整数,虽然它通常用C编程语言表示为inttypes,负值被保留以指示“无值”或错误条件。