当前位置:首页 > 芯闻号 > 充电吧
[导读]无论怎样创建内核对象,都要向系统指明将通过调用C l o s e H a n d l e 来结束对该对象的操作:BOOL CloseHandle(HANDLE hobj);该函数首先检查调用进程的句柄

无论怎样创建内核对象,都要向系统指明将通过调用C l o s e H a n d l e 来结束对该对象的操作:

BOOL CloseHandle(HANDLE hobj);

该函数首先检查调用进程的句柄表,以确保传递给它的索引(句柄)用于标识一个进程实际上无权访问的对象。如果该索引是有效的,那么系统就可 以获得内核对象的数据结构的地址,并可确定该结构中的使用计数的数据成员。如果使用计数是0 ,该内核便从内存中撤消该内核对象。

如果将一个无效句柄传递给C l o s e H a n d l e ,将会出现两种情况之一。如果进程运行正常,C l o s e H a n d l e 返回FA L S E ,而G e t L a s t E r r o r 则返回E R R O R _ I N VA L I D _ H A N D L E 。如果进程正在排除错误,系统将通知调试程序,以便能排除它的错误。

在C l o s e H a n d l e 返回之前,它会清除进程的句柄表中的项目,该句柄现在对你的进程已经无效,不应该试图使用它。无论内核对象是否已 经撤消,都会发生清除操作。当调用C l o s e H a n d l e 函数之后,将不再拥有对内核对象的访问权,不过,如果该对象的使用计数没有递减为 0 ,那么该对象尚未被撤消。这没有问题,它只是意味着一个或多个其他进程正在使用该对象。当其他进程停止使用该对象时(通过调用C l o s e H a n d l e ),该对象将被撤消。

假如忘记调用C l o s e H a n d l e 函数,那么会不会出现内存泄漏呢?答案是可能的,但是也不一定。在进程运行时,进程有可能泄漏资源(如 内核对象)。但是,当进程终止运行时,操作系统能够确保该进程使用的任何资源或全部资源均被释放,这是有保证的。对于内核对象来说,系统将 执行下列操作:当进程终止运行时,系统会自动扫描进程的句柄表。如果该表拥有任何无效项目(即在终止进程运行前没有关闭的对象),系统将关 闭这些对象句柄。如果这些对象中的任何对象的使用计数降为0 ,那么内核便撤消该对象。

因此,应用程序在运行时有可能泄漏内核对象,但是当进程终止运行时,系统将能确保所有内容均被正确地清除。另外,这个情况适用于所有对象、 资源和内存块,也就是说,当进程终止运行时,系统将保证进程不会留下任何对象。

 

 

 

共享跨越进程边界的内核对象的第二种方法是给对象命名。许多(虽然不是全部)内核对象都是可以命名的。例如,下面的所有函数都可以创建命名的内核对象:

HANDLE CreateMutex(

   PSLCURITY_ATTRIBUTES psa,

   BOOL bInitialOwner,

   PCTSTR pszName);

 

HANDLE CreateEvent(

   PSECURITY_ATTRIBUTES psa,

   BOOL bManualReset,

   BOOL bInitialState,

   PCTSTR pszName);

 

HANDLE CreateSemaphore(

   PSECURITY_ATTRIBUTES psa,

   LONG lInitialCount,

   LONG lMaximumCount,

   PCTSTR pszNarne);

 

HANDLE CreateWaitableTimer(

   PSLCURITY_ATTRIBUTES psa,

   BOOL bManualReset,

   PCTSTR pszName);

 

HANDLE CreateFileMapping(

   HANDLE hFile,

   PSECURITY_ATTRIBUTES psa,

   DWORD flProtect,

   DWORD dwMaximumSizeHigh,

   DWORD dwMaximumSizeLow,

   PCTSTR pszName);

 

HANDLE CreateJobObject(

   PSECURITY_ATTRIBUTES psa,

   PCTSTR pszName);

所有这些函数都有一个共同的最后参数p s z N a m e 。当为该参数传递N U L L 时,就向系统指明了想创建一个未命名的(匿名)内核对象。当创建一个未命名的对象时,可以通过使用继承性(如上一节介绍的那样)或D u p l i c a t e H a n d l e (下一节将要介绍)共享跨越进程的对象。若要按名字共享对象,必须为对象赋予一个名字。

如果没有为p s z N a m e 参数传递M U L L ,应该传递一个以0 结尾的字符串名字的地址。该名字的长度最多可以达到M A X _ PAT H (定义为2 6 0 )个字符。但是,M i c r o s o f t 没有提供为内核对象赋予名字的指导原则。例如,如果试图创建一个称为“J e ff O b j ”的对象,那么不能保证系统中不存在一个名字为“J e ff O b j ”的对象。更为糟糕的是,所有这些对象都共享单个名空间。由于这个原因,对下面这个C r e a t e S e m a p h o r e 函数的调用将总是返回N U L L :

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在这篇文章中,小编将为大家带来Linux内核的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 嵌入式 Linux 内核

以下内容中,小编将对嵌入式linux内核移植实现方案的相关内容进行着重介绍和阐述,希望本文能帮您增进对嵌入式的了解,和小编一起来看看吧。

关键字: 嵌入式 Linux 内核

上海2022年11月29日 /美通社/ -- 2022年11月4日至6日,具有国际影响力的金融科技经纪商ATFX参加且赞助了2023年“爱丁堡公爵杯”预选赛。此次预选赛是在墨西哥金塔纳罗奥州坎昆月亮宫酒店球场(Hotel...

关键字: 内核 进程 TE SE

据业内信息报道,近日半导体封测大厂日月光已从高通公司获得Oryon芯片的封测大单。

关键字: 高通 内核 Oryon 封测 日月光

据业内消息,在近日举办的Snapdragon技术峰会中,高通公司公布了新一代定制ARM内核Oryon。

关键字: 高通公司 ARM 内核 Oryon

北京2022年11月15日 /美通社/ -- "双十一"当天,思享无限正式推出拾遗计划,聚焦非遗文化的传播与传承,将传统文化与直播新的媒介语境相融合,让非遗传承者、非遗爱好者在直播平台上共同参与、共同...

关键字: 互联网 内核 数字化

高德智感推出PT系列红外热像仪新品,内核搭载1280x1024非制冷氧化钒红外探测器,率先拥有百万像素的红外热像仪产品。同时测温精度高达正负1摄氏度,热灵敏度NETD不超过55mK,可辨识微小的热差异,并自动追踪全屏最高...

关键字: 红外热像仪 NET NFC 内核

2022北京马拉松于11月6日开跑。本次北马采用集“数字化注册”、“人脸识别核验”、“AI测温”以及“北京健康宝健康码状态、全程新冠疫苗接种和24小时内核酸检测阴性证明”多验合一的物联网智能终端——声智科技IDA数字哨点...

关键字: 人脸识别 内核 数字化 智能终端

上海2022年11月1日 /美通社/ -- 近日,由上海勃林格殷格翰药业有限公司与华东理工大学药学院合作编写的高等学校通识课精品教材《质量文化导论》正式出版发行。这也是国内首门质量文化课程配套教材。该书的出版有望助力全国...

关键字: 内核 编写

上海, 2022年11月1日 /美通社/ -- 11月1日,坐落于上海市普陀区苏州河畔的艺康大中华区总部新装开启。上海市普陀区副区长肖立、上海第一财经传媒有限公司总经理陈思劼、以及来自普陀区投资促进办公室、长风...

关键字: BSP 内核 研发中心
关闭
关闭