Linux下的“句柄”(文件句柄,窗口句柄)

在windows中,句柄是一个32位的整数,是内存中维护的一个对象的地址列表的整数索引,这些对象包括:窗口(window)、块(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)。

在Linux中,每一个进程都由task_struct 数据结构来定义,即PCB,进程通过PCB中的文件描述符表找到文件描述符fd所指向的文件指针filp,文件描述符表是一个指针数组,每一个元素都指向一个内核的打开文件对象,而fd,就是这个表的下标。当用户打开一个文件时,内核会在内部生成一个打开文件对象,并在这个表里找到一个空项,让这一项指向生成的打开文件对象,并返回这一项的下标作为fd,Linux中的文件描述符类似于Windows下文件句柄的概念,但区别是Windows的文件句柄是一个全局的概念,而Linux下文件句柄的作用域只在本进程空间,其中0(标准输入)、1(标准输出)、2(标准错误)是每一个进程中相同的文件描述符,由操作系统规定好,文件描述符所指向元素的文件指针为struct file结构体,在系统中是一个全局的指针。

在linux的X Window桌面环境下,Window 类似于Windows下的窗口句柄,X11/X.h中定义如下:

typedef unsigned long int XID;
typedef XID Window;
typedef XID Font;
typedef XID Pixmap;
typedef XID Drawable;
typedef XID Cursor;
typedef XID Colormap;
typedef XID GContext;
typedef XID KeySym;

同时,X的官方解释(参考https://www.x.org/wiki/guide/concepts/#index10h4)如下:

XIDs

Many resources managed by the server are assigned a 32-bit identification number, called an XID, from a server-wide namespace. Each client is assigned a range of identifiers when it first connects to the X server, and whenever it sends a request to create a new Window, Pixmap, Cursor or other XID-labeled resource, the client (usually transparently in Xlib or xcb libraries) picks an unused XID from it‘s range and includes it in the request to the server to identify the object created by this request. This allows further requests operating on the new resource to be sent to the server without having to wait for it to process the creation request and return an identifier assignment. Since the namespace is global to the Xserver, clients can reference XID‘s from other clients in some contexts, such as moving a window belonging to another client.

大概意思是:

X Server通过一个32比特的标识号标识资源。每一个客户端在第一次连接到X Server时,会被赋值一个标识范围,无论是向X Server请求创建一个Window、Pixmap、或者其他XID标记的资源,客户端(通常对于Xlib或xcb库来说是透明的)从此范围选择一个未使用的XID,同时在向X Server发送请求时包含此XID以识别此次请求创建的资源。这种方式允许同时向X Server请求多个新的资源,而不需要等待每次资源创建成功并返回XID。因为对于X Server来说,域名是全局的,所以在同一个上下文中,不同的客户端之间可以相互引用XID,例如在一个客户端中移动属于另一个客户端的窗口。

在Xorg中,客户端资源(包括XID)使用一个数组保存(dix/resource.c):

static ClientResourceRec clientTable[MAXCLIENTS];

当客户端向X Server请求资源时,会查询数组中相关的资源。

原文地址:https://www.cnblogs.com/lizhenneng/p/10290127.html

时间: 2024-10-18 04:46:47

Linux下的“句柄”(文件句柄,窗口句柄)的相关文章

linux下scoket句柄查询

关于linux下scoket打开超过设置的参数,并且网站应用打开比较慢,和报错 too mary open files错误时. 首先查询当前服务器的句柄数量 #lsof -n |awk '{print $2}'|sort|uniq -c|sort -nr|more 前列是句柄数量  后列是进程编号 #ps -aef|grep 7191 查看进程编号对应的进程 再增加open file的数量 使用ulimit -n  4096  增加到4096  进行测试

Linux下查看句柄

查看各个分区的句柄数 df -ih 查看句柄最大数 ulimit -n 查看23711进程连接句柄数 lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more |grep 23711 查看所有进程句柄数 lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more第一列是句柄数,第二列是PID 查看连接状态 netstat -an lsof -i 查看某个线程号的详细信息.ps -aef|grep 24204

Linux下高并发socket最大连接数所受的各种限制(详解)

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [[email protected] ~]$ ulimit -n1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中

Linux下常见服务器模型

Linux下常见服务器模型 到今天在公司呆了8个月,完成从校园人到职场人的转身.出身社会,感触颇多,一切身不由己.在工作中快乐过.焦虑过.失望过,到最后的心凉,这一路下来成长不少.大学毕业设计涉及网络知识,当时学习了一些基础的网络知识,工作不久,转到新的项目组hms做的产品IPTV刚好和网络相关,最近几个月一直在看<linux高性能服务器编程>,在网上也看了不少文章,一直想写篇总结. 基础 图1 c/s架构通信 图1是一个简化的tcp通信过程,左侧为“服务器端”,右侧为“客户端”,tcp协议本

Linux下C程序的链接过程

今天看到一个很有意思的小程序,它让我对Linux下C程序的编译链接有了一个全新的认识! 这个程序的就是写一个简单的输出"hello World!":   要求:1.不使用C运行库,写一个独立于任何库的程序.(也就是说我们不能#include<stdio>).       2.不适用main函数为程序的入口(大家都知道一般使用了库的程序都是使用main函数作为程序的入口,在这里我们使用自己写的函数nomain作为程序的入口).       3.使用连接器ld把程序的所有段合为

Linux下套接字详解(十)---epoll模式下的IO多路复用服务器

epoll模型简介 epoll可是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,其实都I/O多路复用技术而已,并没有什么神秘的. 其实在Linux下设计并发网络程序,向来不缺少方法,比如典型的Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及select模型和poll模型,那为何还要再引入Epoll这个东东呢?那还是有得说说的- 常用模型

linux下抓包工具tcpdump详解

本文转自:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉无用的信息. 实用命令实例 默认启动

玩玩负载均衡---在window与linux下配置nginx

最近有些时间,开始接触负载均衡方面的东西,从硬件F5再到Citrix Netscalar.不过因为硬件的配置虽然不复杂,但昂贵的价格也让一般用户望而却步(十几万到几十万),所以只能转向nginx,squid这类有反向代理功能的软件了.好在其设置都不是很麻烦. 本文就之前所做过的安装和配置步骤做一下总结分享出来,以免日后忘记了.      首先是windows系统,这里建议使用window 2003企业版,而不要作用win7(太新了,我遇到无法启动nginx的问题).要说的是,在windows下配

Linux下select函数的使用

Linux下select函数的使用 转载:http://www.cnblogs.com/hjslovewcl/archive/2011/03/16/2314330.html 一.Select 函数详细介绍 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发 生,