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

Kaw*_*iKx 11 assembly file handle

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

Hea*_*utt 9

在计算机软件API的上下文中存在通常称为"句柄"的通用概念.在评论中,您可能找到了关于该主题维基百科文章的链接.

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

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

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

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

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

没有文档的DOS


小智 8

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

int handle = open( "foo.txt", OTHER_STUFF_HERE );
Run Code Online (Sandbox Code Playgroud)

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