关于《Windows核心编程 5th》“3.3.4终端服务命名空间”章节的理解

很久之前看到这一小节的时候,基本是一头雾水、半知半解的感觉,因为有太多不熟悉的概念。当时也在网上找了一些资料和博客来看,感觉帮助也不大,于是就跳过了。今天论坛的左懒童鞋突然问了我这个地方应该如何理解,于是决定再好好去看看书,验证自己的想法。


书上主要原话:

在正在运行终端服务的计算机中,有多个用于内核对象的命名空间。其中一个是全局命名空间,所有客户端都能访问的内核对象要放在这个命名空间。对于两个或多个会话正在运行同一个应用程序的情况,这样的安排可以避免会话之间彼此干扰---一个会话不会访问另一个会话的对象,即使对象的名称相同(关键点)。(会话这个概念比较抽象,还没有找到一个适合的描述,我个人的感觉会话就是类似于一个域,然后里面有一堆进程。

对于服务开发人员,由于必须在与客户端应用程序不同的一个会话中运行,所以会影响到共享内核对象的命名约定。任何对象想要和用户应用程序共享,都必须在全局命名空间中创建它。快速用户切换也会带来类似的问题。我们知道,利用快速用户切换功能,不同的用户可以登录不同的会话,并分别启动自己的用户应用程序。如果我们写的一个服务要与这些应用程序通信,就不能假定它和用户应用程序在同一个会话中运行。



针对上面那两段话,我在Win7环境写了几行代码,做了个简单的测试。

首先在admin帐户(一个会话)中,我在程序中用:

HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Global\\Handle")) ; 
创建一个放在全局命名空间中的互斥量对象,并调用Sleep(INFINITE)挂起程序,让个内核对象一直保持着。

然后将我的应用程序复制到guest帐户的文件夹中,切换guest帐户(另一个会话)并运行这个程序,发现互斥量创建失败,CreateMutex返回NULL,ErrorCode为ERROR_ALREADY_EXISTS。

然后,我将上述代码改为:

HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Local\\Handle")) ;
随后执行同上的操作,发现在guest帐户中,这个程序也能够成功创建这个同名的内核对象。


于是,也就是验证了我的想法,其实就是一个命名空间的问题,好吧,我也不知道自己想表达些什么,感觉在说废话.......

测试代码:

#include<windows.h>
#include<cstdio>
#include<iostream>

int main(void)
{
	//在全局命名空间中创建内核对象,用不同帐户运行该程序,不能创建同名的内核对象。
//	HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Global\\Handle")) ; 	
	//在局部命名空间中创建内核对象,用不同帐户运行该程序,可以创建同名的内核对象。
//	HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Local\\Handle")) ;	
	HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Handle")) ;  //同上

	//在局部命名空间测试示例中要用GetLastError检测,在全局命名空间测试示例中要判断hMutex是否为NULL
	if(NULL == hMutex || GetLastError() == ERROR_ALREADY_EXISTS)   
	{
		printf("已经存在互斥量对象\n") ;
		return 0 ;
	}
	printf("成功创建互斥量对象\n") ;

	Sleep(INFINITE) ;

	return 0 ;
}









  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值