什么是文件句柄以及它对程序员有用的地方?

时间:2011-05-24 15:13:15

标签: file assembly handle

我正在学习汇编语言和C.这个新章节我开始谈论'文件句柄',屏幕显示的文件句柄和键盘输入的文件句柄等。我不知道什么是文件句柄?我指的是Peter Abel的IBM PC ASSEMBLY LANGUAGE PROGRAMMING

3 个答案:

答案 0 :(得分:8)

文件句柄是一个整数值,用于处理打开的文件。这些句柄是高度操作系统特定的,但在支持open()调用的系统上,您可以创建一个这样的句柄:

int handle = open( "foo.txt", OTHER_STUFF_HERE );

然后,您可以使用带有读/写调用的句柄。句柄的不可移植性意味着大多数人都避免使用它们,而是使用C中的流库函数,例如fopen,fread,fwrite等。

答案 1 :(得分:8)

在计算机软件API的上下文中存在通常称为“句柄”的通用概念。在评论中,您可能找到了Wikipedia article on that subject的链接。

您正在处理句柄数据类型的特定实现 - 从int 0x21接口返回的IBM PC / DOS文件句柄。如果您想了解有关这些特定文件句柄的更多信息,可能需要参考书籍Undocumented DOS,其中详细介绍了内存中的数据结构,这些结构允许您进一步调查这些句柄。

另一种特定类型的句柄是从名为open()的POSIX标准接口返回的文件描述符。此功能在Linux,Windows NT,Mac OS和许多其他系统等平台上的C运行时库中实现。从open()调用返回的整数可能不是负数。

除非您在DOS下运行,否则您的文件句柄可能由Windows NT操作系统提供。这些文件句柄从CreateFile()(用于打开和创建文件)返回,并且从此函数返回的句柄的唯一非法值是INVALID_HANDLE_VALUE。即,Windows NT API可能会返回(通过强制转换)一个“负”整数,尽管它已经打开了文件。

在所有这些情况下,文件句柄用于引用一些跟踪文件打开方式的数据结构。跟踪的一个重要事项是当前文件位置。位置或指针lseek()函数在POSIX中设置,并由tell()函数读取。任何read()write()都是从当前文件指针的位置发生的。

您的程序可以在两个不同的句柄下打开同一个文件。在这种情况下,每个句柄的文件指针是不同的。使用lseek()更新一个句柄的文件指针不会影响同一文件的另一个句柄的文件指针。

Undocumented DOS

答案 2 :(得分:3)

句柄是内核在内部用来访问某些资源的东西。只有内核确实知道它意味着什么,用户进程只告诉它想要访问该资源时要使用的值。它们的另一个优点是文件句柄可以在进程之间共享 - 而你不能用指针来完成它。

Windows使用遍布各处的句柄...文件,位图,设备上下文,字体等。