文件句柄(Linux系统文件操作之句柄)
一、文件句柄是什么
问题一:文件句柄是什么在文件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语言编写软件很多地方都会用到句柄自己慢慢学
二、Linux之文件句柄
ulimit:
1,查看进程允许打开的最大文件句柄数
ulimit-n
2,设置进程能打开的最大文件句柄数
ulimit-n xxx
-H指定资源的硬限制
-S指定资源的软限制
hard代表当前硬限制
soft代表当前软件限制
unlimited代表不限制.
3,文件限制配置文件
/etc/security/limits.conf
4,文件句柄最大数据配置
配置文件:/proc/sys/fs/file-max
这个参数的默认值和内存大小有关系,可以使用公式:file-max内存大小/ 10k.
4.1建议将整个系统的文件句柄值至少设置为 65536
4.2 echo"65536">/proc/sys/fs/file-max
4.3 sysctl-w fs.file-max=65536
4.4 echo"fs.file-max=65536">>/etc/sysctl.conf
5,文件句柄使用情况配置文件:/proc/sys/fs/file-nr
这三个值分别指:系统已经分配出去的句柄数、已经分配但是还没有使用的句柄数以及系统最大的句柄数(和file-max一样)。
6,查看进程打开的文件句柄数
lsof:列出当前系统打开文件的工具。
三、linux中文件句柄未释放,会导致什么问题
linux删除文件后没有释放空间
今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间没有变化
os:centos4.7
现象:
发现当前磁盘空间使用情况:
[root@ticketb~]# df-h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22%/
none 16G 0 16G 0%/dev/shm
/dev/sda9 2.9G 37M 2.7G 2%/tmp
/dev/sda7 4.9G 1.9G 2.7G 42%/usr
/dev/sda8 2.9G 145M 2.6G 6%/var
/dev/mapper/vghome-lvhome
20G 19G 11M 100%/home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35%/u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5%/u01/backup
通过以下的命令找到没用的文件,然后删除
[root@ticketb~]# find/home/oracle/admin/dbticb/udump/-name"dbticb_*.trc"-mtime+50| xargs rm-rf
然后在查看磁盘空间使用情况,发现没有/home空间没有变化
[root@ticketb~]# df-h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22%/
none 16G 0 16G 0%/dev/shm
/dev/sda9 2.9G 37M 2.7G 2%/tmp
/dev/sda7 4.9G 1.9G 2.7G 42%/usr
/dev/sda8 2.9G 145M 2.6G 6%/var
/dev/mapper/vghome-lvhome
20G 19G 11M 100%/home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35%/u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5%/u01/backup
这个郁闷啊,明明删除文件了,怎么空间没有被释放啊,rm命令应该是直接删除啊,在查看下/home下还有什么占用空间
[root@ticketb~]# du-h--max-depth=1/home
16K/home/lost+found
2.6G/home/oracle
2.6G/home
可这里显示空间已经释放了啊,于是google下,
未释放磁盘空间原因:
在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的文件夹结构上解除链接(unlink).然而假设文件是被
打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。而我删除的是oracle的告警log文件
删除的时候文件应该正在被使用
解决方法
首先获得一个已经被删除可是仍然被应用程序占用的文件列表,例如以下所看到的:
[root@ticketb~]# lsof|grep deleted
oracle 12639 oracle 5w REG 253,0 648 215907/home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc(deleted)
oracle 12639 oracle 6w REG 253,0 16749822091 215748/home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 12639 oracle 7u REG 253,0 0 36282/home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb(deleted)
oracle 12639 oracle 8w REG 253,0 16749822091 215748/home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 12641 oracle 5w REG 253,0 648 215907/home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc(deleted)
oracle 12641 oracle 6w REG 253,0 16749822091 215748/home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
。
。
。
oracle 23492 oracle 6w REG 253,0 16749822091 215748/home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 23492 oracle 7u REG 253,0 0 36282/home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb(deleted)
oracle 23492 oracle 8w REG 253,0 16749822091 215748/home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 23494 oracle 10u REG 253,0 0 36307/home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstrmandb(deleted)
从输出结果能够看到/home/oracle/admin/dbticb/bdump/alert_dbticb.log还被使用,未被释放空间
怎样让进程释放呢?
一种方法是kill掉相应的进程,或者停掉使用这个文件的应用,让os自己主动回收磁盘空间
我这个环境有非常多进程在使用的这个文件,停掉进程有点麻烦,再有就是风险非常大
当linux打开一个文件的时候,Linux内核会为每个进程在/proc/『/proc/nnnn/fd/文件夹(nnnn为pid)』建立一个以其pid
为名的文件夹用来保存进程的相关信息,而其子文件夹fd保存的是该进程打开的全部文件的fd(fd:file descriptor)。
kill进程是通过截断proc文件系统中的文件能够强制要求系统回收分配给正在使用的的文件。
这是一项高级技术,仅到管理员确定不会对执行中的进程造成影响时使用。应用程序对这样的方
式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题
所以我还是采用停应用来解决
restart oracle数据库,发现/home/oracle/admin/dbticb/bdump/alert_dbticb.log相应的空间被释放
在查看磁盘空间的使用情况,发现空间已经回收了
[root@ticketb~]# df-h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22%/
none 16G 0 16G 0%/dev/shm
/dev/sda9 2.9G 37M 2.7G 2%/tmp
/dev/sda7 4.9G 1.9G 2.7G 42%/usr
/dev/sda8 2.9G 145M 2.6G 6%/var
/dev/mapper/vghome-lvhome
20G 2.6G 16G 15%/home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35%/u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5%/u01/backup
ok,问题解决,然后做下收尾工作就可以
-------------------------------------------------------------------------------------------------
学习下lsof命令
lsof全名list opened files,也就是列举系统中已经被打开的文件。我们都知道,linux环境中,不论什么事物都是文件,
设备是文件,文件夹是文件,甚至sockets也是文件。所以,用好lsof命令,对日常的linux管理非常有帮助。
lsof是linux最常常使用的命令之中的一个,通常的输出格式为:
引用
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME