首页
社区
课程
招聘
[求助]不同线程打开同一个文件的句柄是一样的?
发表于: 2016-5-3 19:18 5326

[求助]不同线程打开同一个文件的句柄是一样的?

2016-5-3 19:18
5326
	HANDLE hFile = CreateFileW(L"C:\\Users\\xxx\\Desktop\\000.docx", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE != hFile)
	{
		DisplayInfoExW(__FUNCTIONW__, DBG_LVL_INFO, L"handle = %d", hFile);
		CloseHandle(hFile);
		hFile = INVALID_HANDLE_VALUE;
	}


	HANDLE hThread = NULL;
	hThread = (HANDLE)_beginthreadex(NULL,
		0,
		(unsigned int(__stdcall*)(void*))TestThread,
		NULL,
		0,
		NULL);
	CloseHandle(hThread);
	hThread = NULL;

	for (;;)
	{
		Sleep(1000);
	}


unsigned int __stdcall TestThread(void* lpParam)
{
	HANDLE hFile = CreateFileW(L"C:\\Users\\xxx\\Desktop\\000.docx", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE != hFile)
	{
		DisplayInfoExW(__FUNCTIONW__, DBG_LVL_INFO, L"handle = %d", hFile);
		CloseHandle(hFile);
		hFile = INVALID_HANDLE_VALUE;
	}
	return 0;
}



一个线程打开一个文件后,关闭句柄,然后启动另一个线程,打开这个文件,得到的句柄跟第一次打开是一样的,为什么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 144
活跃值: (31)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
2
句柄系统给分配的。可能你释放后系统看到这个ID 没有被占用就继续给你分配这个吧。 假如刚才打开的不关 开共享 再次打开那句柄就不一致了。
2016-5-3 19:26
0
雪    币: 2291
活跃值: (938)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
没啥奇怪的,你从ATM机取了100块钱,觉得不想用又存进去。然后换张银行卡,也取100,发现居然就是你前面取的那张。
2016-5-3 20:38
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
4
有点专牛角尖的感觉
2016-5-4 00:17
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
句柄是一个标号而已(不是地址),同一个内核对象可以有多个句柄(引用计数),如果关闭了再打开,当然有可能用到同一个标号。如果不关闭再打开,同一进程内不会出现相同的标号。
2016-5-4 13:24
0
雪    币: 441
活跃值: (1120)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
《windows核心编程》 中说过。 一个进程会维护一个与进程相关的内核对象句柄表。当你打开一个文件的时候,句柄表里就存放了这个文件的内核对象信息。再次CreateFile的时候只会增加引用计数,而不会再去新建一个内核对象。CloseHandle会减少引用计数。引用计数为0的时候,内核对象就会被销毁。嗯就是这样。
2016-5-19 13:45
0
雪    币: 441
活跃值: (1120)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
哇哦,原来你是先close了再去create啊。可能是根据句柄表的个数来定的?你可以试试第一次close之后create一个其他的内核对象 比如 event ,然后另外一个线程再去createfile试试
2016-5-19 13:47
0
游客
登录 | 注册 方可回帖
返回
//