File 什么是文件句柄,它在哪里对程序员有用?
我正在学习汇编语言和C语言。我开始的这一章讨论了“文件句柄”,屏幕显示的文件句柄和键盘输入的文件句柄等。我不知道什么是文件句柄?我指的是Peter Abel的IBM PC汇编语言编程文件句柄是一个整数值,用于处理打开的文件。此类句柄高度特定于操作系统,但在支持open()调用的系统上,可以创建如下句柄:File 什么是文件句柄,它在哪里对程序员有用?,file,assembly,handle,File,Assembly,Handle,我正在学习汇编语言和C语言。我开始的这一章讨论了“文件句柄”,屏幕显示的文件句柄和键盘输入的文件句柄等。我不知道什么是文件句柄?我指的是Peter Abel的IBM PC汇编语言编程文件句柄是一个整数值,用于处理打开的文件。此类句柄高度特定于操作系统,但在支持open()调用的系统上,可以创建如下句柄: int handle = open( "foo.txt", OTHER_STUFF_HERE ); 然后可以在读/写调用中使用句柄。句柄的不可移植性意味着大多数人避免使用它们,而是使用C中的流
int handle = open( "foo.txt", OTHER_STUFF_HERE );
然后可以在读/写调用中使用句柄。句柄的不可移植性意味着大多数人避免使用它们,而是使用C中的流库函数,如fopen、fread、fwrite等。在计算机软件API的上下文中,有一个通用的概念,通常称为“句柄”。在评论中,您可能已经找到了指向的链接 您正在处理句柄数据类型的特定实现——从
int0x21
接口返回的IBM PC/DOS文件句柄。如果您想了解有关这些特定文件句柄的更多信息,您可能需要查阅这本书,其中详细介绍了内存中的数据结构,允许您进一步研究这些句柄
另一种特定类型的句柄是从名为open()
的POSIX标准接口返回的文件描述符。此函数在Linux、Windows NT、Mac OS和许多其他系统上的C运行时库中实现。调用open()
返回的整数不能是负数
除非您是在DOS下运行,否则您的文件句柄可能是由Windows NT操作系统提供的。这些文件句柄是从CreateFile()
(用于打开和创建文件)返回的,从该函数返回的句柄的唯一非法值是无效的句柄值。也就是说,Windows NT API可能会返回(通过强制转换)被视为“负”整数的值,尽管它已经打开了文件
在所有这些情况下,文件句柄用于引用某些数据结构,以跟踪文件是如何打开的。跟踪的一个重要内容是当前文件位置。位置或指针由lseek()
函数在POSIX中设置,并由tell()
函数读取。任何read()
或write()
都是从当前文件指针的位置执行的
您的程序可以在两个不同的句柄下打开同一个文件。在这种情况下,每个句柄的文件指针是不同的。使用lseek()
更新一个句柄的文件指针不会影响另一个句柄指向同一文件的文件指针
句柄是内核内部用来访问某些资源的东西。只有内核真正知道它意味着什么,只有当用户进程想要访问此资源时,才会被告知使用什么值。它们还有另一个优点,即文件句柄可以在进程之间共享,而指针则无法做到这一点
Windows到处都使用手柄。。。文件、位图、设备上下文、字体等。Unix等价物是一个“文件描述符”。这是完全相同的概念(一个可以传递给内核的整数,它知道已经打开的文件)。大多数人使用fopen()?这根本不是真的。@Heath什么,你认为大多数人使用open()?根据我的经验,不是这样。等等,有些人实际上使用open()???:-)是的,好吧,我是其中之一,但只适用于依赖操作系统的东西,你不能用fopen()d文件…@Brian我确信人们确实使用open,我确信Linus一直在使用它:-)我同样确信大多数人都不使用。@Neil--支持open()的不是“系统”,而是运行时库open()
在Windows NT(不含cygwin)下的工作原理与在Linux下的工作原理相同。