问题描述:
解析:
文件句柄
除了你模仿唯我论者哲学家编写一个人工智能程序, 你的程序使用不和外界通讯的方法。在班级例子中的第三和四行, 你将看到"GRADES", 这是引用另一个Perl文件的数据类型, 称为据柄(filehandle)。一个句柄就是你给一个文件,设备,管套(socket)或管道的一个名字, 以便帮助你记住你正处理的名字, 并隐藏某些缓存等的复杂性。(在内部, 句柄类似C++语言的流(streams), 或BASIC中的I/O通道)句柄使你从不同的地方输入和输出给不同的地方都较容易。使Perl成为好语言的一个原因是它能和多个文件通讯并一次处理他们。对外部对象有好的符号名字是一个好语言的一个组成部分[1]。
[1]其他使Perl是一个好语言的是: 它是8位的, 是可嵌入的, 你能通过扩展模式在Perl中嵌入其他程序。它是简明的,网络上容易使用。环境上是清楚的,容易对话。你能以许多不同的方法引用它(就象前面看到的)。总之,语言本身不是如此严格的结构,以至于你不能使它超出你的问题。又回到TMTOWTDI。
你创建一个句柄,并通过open函数把它和一个文件联结。open有两个参数: 句柄和你想与它联结的一个文件名。Perl也给出一些预定义(和预打开的)句柄。STDIN是你程序的正常输入通道, 而STDOUT是你程序的正常输出的通道。STDERR是一个附加的输出通道, 以便当把输入转为输出时, 程序能给出一些说明[2]。
[2]一般地, 这些句柄和你的终端联结, 所以你能输入你的程序并能看到, 但他们也可以和文件联结。Perl能给你这些预定义句柄, 因为你的 *** 作系统已提供这些。在UNIX下, 进程从他的父进程(一般是一个shell)继承标准输入, 输出和错误。一个shell的责任之一是建立这些I/O流, 以便子进程不必考虑这些)。
既然你能为各种目的(输入, 输出, 管道)使用open函数创建句柄, 你就必须能指明你要做什么。就象在UNIX命令行一样, 你给文件名简单地加些字符。
open(SESAME, "filename")#从已存在的文件读
open(SESAME, "<filename")#显式地,同上面
open(SESAME, ">filename")#创建一个文件并对它写
open(SESAME, ">>filename")#对已有的文件接着写
open(SESAME, "| output-pipe-mand")#建立一个输出过滤
open(SESAME, "input-pipe-mand |")#建立一个输入过滤
就象你看到的, 你可以任意选名字。一旦打开句柄SESAME, 它就能被用于存取文件或管道, 直到它被显式地关闭(用close(SESAME)), 或对同一句柄的一系列open把这个句柄和另一文件联结[3]。
[3]打开一个已打开的句柄是隐式地关闭第一个文件, 使它对文件句柄不可取,并打开一个不同的文件。你必须小心这是你真正想做的。有时,偶然碰巧,比如,当你open($handle,$file)时, $handle正好包含空串(null)。确认设置$handle为某个单一个量, 否则你将对空句柄打开一个新的文件。
一旦你已为输入打开一个句柄(或你使用STDIN), 你就能使用"行读 *** 作"<>, 读一行。这个也以钻石 *** 作闻名,因为它的形状。这个钻石 *** 作包含你想读的句柄(<SESAME>)[4]。使用STDID句柄读用户提供的答案, 如下:
[4]空钻石 *** 作<>, 将从命令行指定的所有文件读, 如果没有指定, 从STDIN读。(这是许多UNIX"过滤"程序的标准行为)
print STDOUT "Enter a number: "#请求输入一个数
$number = <STDIO>#输入一个数
print STDOUT "The number is $number"#输出这个数
你明白我们给你的例子吗?在print语句中STDOUT做什么?这就是你使用一个输出句柄的方法之一。一个句柄可以作为print语句的第一个参数, 如果存在, 告诉往哪儿输出。在例子中,句柄是冗余的,因为输出已经是STDOUT。对于输入的缺省是STDIN, 对于输出的缺省是STDOUT。(在班级例子的18行, 我们为避免使你混淆, 我们省略了。)
我们也有一件事使你不明白。如果你试上面的例子,你可以注意到你得到一个特别的空行。因为读时没有自动地从你的输入行中删除换行符(newline)(例如, 你输入"9")。对于这些情况,当你想删除换行符时,Perl提供chop和chomp函数。chop将不加区别地删除(并返回)传给它的最后一个字符, 而chomp只删除记录标识的末尾(一般地是""), 并返回这样删除的字符数。你将经常看到这样输入一行:
chop($number = <STDIN>)#输入一个数并删除换行符
意思是:
$number = <STDIN>#输入一个数
chop($number)#删除换行符
mov
int
mov
int
endp
ends
end ah,9
21h
ah,4ch
21h
main
;结束进程
这是一个不寻常的程序,它的特殊性就在于使用了"不寻常"的文件句柄。还记得前面我们讨论文件句柄时所遗留的那个问题吗?我们打开的第一个文件的句柄号是05H而不是00H,之所以这样是因为句柄号00H-04H已经被占用了。而且更为特殊的是这五个句柄不是赋予五个文件的,而是赋予五种硬件设备。这听上去好象越来越乱了,文件和硬件设备竟然又出现了某种联系,实在让人搞不明白。我想若要弄清楚这个问题,我们还是要从一些实际现象出发。
学过C语言的朋友一定接触过fprintf函数的这样一个用法:
fprintf(STDERR,"DANGER!!!......Found a VIRUS......")
本来,在STDERR这个位置上应该是指向一个文件的指针,这个指针的含义和我们现在讨论的文件句柄是一样的(我想也许汇编语言中的文件句柄就是C语言中文件指针的实质,我没有查过权威资料,这个看法是否正确还有待检验)。现在我们在这个位置上放了一个称为STDERR的常量,而且我们知道这样使用fprintf函数可以使引号中的文字出现在显示器上而不是某个文件中,而显示器又恰好是一个硬件设备。由此看来,文件、文件指针和硬件设备确实应该存在某种联系,这种联系并非在汇编语言程序设计中有体现,在C这样的高级语言中已经体现出来了。那么STDERR又是个什么东西呢?
这个常量出现在名为STDIO.H的一个包含文件中,在C语言中它被称为"标准错误输出设备(STanDard ERRor output device)"C语言中还有两个比较常用的常量,分别为STDIN和STDOUT,即标准输入和标准输出设备。这三种设备通常都与键盘和显示器有关,使用fprintf函数从STDIN读入数据时相当于等待键盘输入;而向STDOUT或STDERR输出的内容都会出现在显示器上。这就有点儿象我们刚刚给出的那个汇编程序,在那个汇编程序中我们在输出数据时使用了一个特殊的句柄,结果导致了所有的文字都出现于显示器上而没有写入什么文件中。
看来我们所使用的那个特殊句柄代表的是显示器而不是文件。我们所使用的DOS系统还有这样一个有趣的功能不知道你是否使用过,那就是"重定向"功能。如果在DOS状态下按下面这样的格式使用DIR命令,大家就会发现文件和设备确实具有某种不寻常的联系:
C:\DOS\>DIR>FILE.LST
本来会出现在显示器上的一行行文件名都跑到一个名叫"FILE.LST"的文件中去了。由此我们设想这样一个结论:我们通过调用DOS的文件句柄功能不仅可以 *** 作文件,同样可以 *** 作一些硬件设备。
这个结论是完全正确的,事实上文件与设备本身就具有一些相似的特点:文件可以读入或写出,而硬件设备同样可以"读入"(键盘)和"写出"(显示器、打印机)。既然它们具有这样相同的特性,当然可以使用同样的形式来 *** 作,这就是DOS为我们提供了那五个特殊句柄的原因。我们下面就来详细谈谈这五个特殊的句柄:
表8-3列出了这五个句柄所代表的硬件设备,其中0、1、2三个句柄是我们最常用的。这五种设备在DOS启动之后就已经"打开",所以我们可以直接使用这五个句柄而不必再编制代码将其打开。有关这五个特殊句柄还有一些更值得深思的地方,比如,我们能否使用3FH功能从句柄2所表示的设备中读入信息?能否使用40H功能向句柄3所表示的设备输出信息?我们能否用3EH功能关闭某个句柄所表示的设备?分析这样的问题也非难事,编个程序试一试即可。
句 柄 设备名称 逻辑设备名 缺省设备
00 标准输入设备 CON 键盘
01 标准输出设备 CON 显示器
02 标准错误设备 CON 显示器
03 标准辅助设备 AUX 串行口
04 标准列表设备 PRN 打印机
至此有关文件 *** 作的几个重要功能--建立、打开、读写、关闭--我们都已经讨论,不是很全面,没有深入的地方还要大家自行研究。我们下面的任务就是来讨论文件句柄的一些辅助功能,以此做为这一内容的结束。
综上仔细去揣摩吧。。。
问题一:文件句柄是什么 在文件I/O中,要从一个文件读取数据,应用程序首先要调用 *** 作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给 *** 作系统。当完成任务后,再通过调用系统函数来关闭该文件。
问题二:什么是句柄? 句柄是一个(通常为32位的)整数,它代表一个对象。Windows中的句柄类似传统C或者MS-DOS程序设计中使用的文件句柄。程序几乎总是通过呼叫Windows函数取得句柄。程序在其它Windows函数中使用这个句柄,以使用它代表的对象。
在 Windows 中,窗口可以有许多种。窗口可以是屏幕上的一块矩形封闭区域,比如您熟悉的应用程序窗口。窗体上的控件(例如列表框或滚动条)也可以是窗口,但并不是所有类型的控件都是窗口。桌面上的图标和桌面本身也是窗口。因为所有这些类型的对象都是窗口,所以 Windows 可以用类似的方式处理它们。Windows 给每个窗口一个唯一的句柄,通过句柄 *** 纵该窗口。许多 API 函数可返回句柄或者接受句柄作参数。
创建窗口时,Windows 给它指派一个句柄,窗口消失后句柄被释放。
问题三:“句柄”到底是什么意思 句柄可以理解为 *** 作标示
比如一个程序有好多窗口,每个窗口有好多的属性
如何 *** 作某个窗口就让系统很头疼
于是对不同窗口用不同的标示,窗口句柄
DECLARE_HANDLE 就是HWND
然后好多函数通过这个标示来判断对哪个窗口 *** 作
如 ::SetWindowText( hWnd , strTitle ...
其他的还有好多类型的句柄
想文件句柄,线程句柄等等
句柄不深奥,是翻译者给神话了。就是控制、 *** 作标识!
问题四:句柄是一个什么类型的值? 5分 VC编程――句柄篇
句柄概念在WINDOWS编程中是一个很重要的概念,在许多地方都扮演着重要的角色。但由此而产生的句柄概念也大同小异,比如:&l丁>(Microsoft Press,by Richard Wilton)一书中句柄的概念是:在Windows环境中,句柄是用来标识项目的,这些项目包括:
*.模块(module)
*.任务(task)
*.实例(instance)
*.文件(file)
*.内存块(block of memory)
*.菜单(menu)
*.控制(control)
*.字体(font)
*.资源(resource),包括图标(icon),光标(cursor),字符串(string)等
*.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域(region),以及设备描述表(device context)。
WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行 *** 作。
在>(南京大学出版社)一书中是这么说的:句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
从上面的2个定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(设备描述表句柄),HICON(图标句柄)等等,这当中还有一个通用的句柄,就是HANDLE,比如下面的语句:
HINSTANCE hInstance;
可以改成:
HANDLE hInstance;
上面的2句语句都是对的。
一个WINDOWS应用程序可以用不同的方法获得一个特定项的句柄。许多API函数,诸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。另外,WINDOWS也能通过应用程序的引出函数将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WINDOWS环境下的任何地方对这个句柄进行 *** 作。其实句柄的大量使用已经影响到了每一个WINDOWS的程序设计。
句柄只有当唯一的确定了一个项目的时候,它才开始有意义。句柄对应着项目表中的一项,而只有WINDOWS本身才能直接存取这个表,应用程序只能通过API函数来处理不同的句柄,举个例子来说吧!比如:我们可以为我们的应用程序申请一块内存块,通过调用API函数GlobalAlloc,来返回一个句柄值:
hMem=GlobalAlloc(......)
其实现在hMem的值只是一个索......>>
问题五:书上常说的“文件句柄”是什么? 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。
句柄是一个标识川,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。
文件句柄按照这个概念来理解,就很好理解了。
问题六:什么是句柄 5分 句柄,是系统程序对数据定义的标识,通常是一个整数。
系统程序和用户程序需要进行数据交换,为了避免传递大量数据,尤其是不希望用户直接 *** 作数据,系统使用一个数字来表示这组数据(例如与一个窗口相关的一组数据)。用户程序如果需要对数据进行修改,都只能通过系统程序提供的函数以及数据的句柄和相关参数来完成。
系统程序很可能使用数据的地址作为句柄,但这仅仅是可能,完全取决于定义句柄的程序。
希望解释清楚了。
问题七:linux 查看什么文件打开了句柄 linux系统下查看进程打开文件 在/proc下,对应每个进程有一个以进程号命名的目录,该目录下有一个fd目录,该目录下面的每个文件是一个符号连接,其文件名对应该进程占用的一个文件描述符,而连接指向的内容表示文件描述符对应的实际文件,有多少...
问题八:什么时候需要 close 文件句柄 。
问题九:windows 句柄到底是什么 句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。
windows 之所以要设立句柄,根本上源于内存管理机制的问题―虚拟地址,简而言之数据的地址需要变动,变动以后就需要有人来记录管理变动,(就好像户籍管理一样),因此系统用句柄来记载数据地址的变更。
数据对象加载进入内存中之后即获得了地址,但是这个地址并不是固定的,(至于为什么以及什么情况下变动具体需要大家研究虚拟地址的原理与机制我这里只提我确定知道的例子)数据对象会根据需要在内存与硬盘之间游弋移动(例如不常用的数据会为常用数据让出其占用的内存空间进而被淘汰进硬盘中的虚拟内存之中以优化配置整体系统的资源进而提升效率性能),因此其物理地址总是变动的,那么作为管理者 则必须对 管理对象所发生的变化了如指掌才行,因此系统为进程分配固定的地址(句柄)来存储进程下的数据对象变化后的地址也就是当前的地址,其实设计机制很简单 :系统的某个部门移动了对象的地址后,同时上报给句柄所属部门管理者,管理者将改动写入句柄即可。该数据被重新起用时去其所属句柄内按内容存取即可。
句柄,英文:HANDLE,在Windows编程中是一个很重要的概念,在许多地方都扮演着重要的角色。但由此而产生的句柄概念也大同小异,比如:《Microsoft Windows 3 Developer's Workshop》(Microsoft Press,by Richard Wilton)一书中句柄的概念是:在Windows环境中,句柄是用来标识项目的。
在程序设计中,句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、 *** 作系统)所管理的内存块或对象时,就要使用句柄。
句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。
在上世纪80年代的 *** 作系统(如Mac OS 和Windows)的内存管理中,句柄被广泛应用。Unix系统的文件描述符基本上也属于句柄。和其它桌面环境一样,Windows API大量使用句柄来标识系统中的对象,并建立 *** 作系统与用户空间之间的通信渠道。例如,桌面上的一个窗体由一个HWND类型的句柄来标识。如今,内存容量的增大和虚拟内存算法使得更简单的指针愈加受到青睐,而指向另一指针的那类句柄受到冷淡。尽管如此,许多 *** 作系统仍然把指向私有对象的指针以及进程传递给客户端的内部数组下标称为句柄。
问题十:句柄是什么意思,详细解释下 句柄是编写工具 游戏外挂所用到得窗口ID 游戏窗口进程,比如按键精灵所用到的就是获取游戏窗口(句柄)进程ID E语言编写软件很多地方都会用到句柄 自己慢慢学
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)