Thursday, March 5, 2009

Windows 时间函数, 进程间共享内存, Mutex 等. (C/C++)

开学第二周,老师把操作系统的5个实验全部布置了.
我看老师那么积极,我这两天也积极地把这5个实验都写好了.

Windows这边没什么,和以往一样,查查MSDN,什么都出来了.
Linux那边倒是麻烦,虽然接触Linux有一段时间了,但是开发Linux应用倒是很少~ 没找到像MSDN一样集中的,全面的资料.我想应该是有类似的东西的,只不过没去仔细找.

没遇到什么非常值得写的东西,都是零碎,在这说说:

时间函数:
GetSystemTime
GetLocalTime
正常的Windows中,使用第一个函数取得的应该是中央时区的时间.使用GetLocalTime取得的应该是你右下角的时间.(这里的正常指的是时间时区设置正确,不是指交没交钱).
换句话说,如果你只是想显示时间,用第二个.如果你这个时间是用来通讯的,最好使用第一个.
我们的操作系统老师只是要在程序中显示时间,偏要我们使用第一个,我也没转换,就给他显示第一个了.

不过使用这两个函数得到的只是一个SYSTEMTIME结构,如果要进行计算(比如计算时间差), 就要转化为FILETIME(SystemTimeToFileTime FileTimeToSystemTime).然后转化为ULARGE_INTEGER,然后计算,然后再转化回来.当然你也可以使用GetSystemTimeAsFileTime直接取得FILETIME,然后转化为ULARGE_INTEGER.
总结,Windows时间函数很多很好用.

共享内存:
据说Windows没有直接提供共享内存机制.不过可以使用FileMapping.这东西虽然叫FileMapping,但是它并不需要真正创建一个文件.
可以使用CreateFileMapping创建一个FileMapping,如果要跨线程使用,可以在参数直接传递HANDLE, 或者使用全局HANDLE, 但是如果跨进程使用,就得给他起个名字.传HANDLE是不起作用的.(说实话我不知道为什么,我的同学焦阳说这是因为进程地址空间不一样,我没搞明白,我一直以为Windows里面的句柄都是全局的,有空得去找找资料),另外的进程(比如子进程)必须使用OpenFileMapping,用名字来取得其句柄.
如果要使用里面的类容,只要MapViewOfFile就可以了.用完了之后UnmapViewOfFile.

Mutex:
虽然信号量比较通用,但是大部分时候我认为Mutex比较简单.甚至有可能信号量也是通过Mutex实现的. (没有源码,谁有源码可以给我看看~)
用 CreateMutex 创建, 用 WaitForSingleObject 捕获 , 用ReleaseMutex释放.
和FileMapping相似的是, 跨进程要使用 OpenMutex 取得Mutex的HANDLE.

WaitForSingleObject(Ex), WaitForMultipleObjects(Ex):
这四个函数可真是伟大呀.它可以捕获以下东西.
Change notification
Console input
Event
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
比如Mutex,他可以捕获Mutex可用.Process就是捕获Process结束.
从这里可以看出一点,就是这些东西有着相同的共性.我觉得他们是使用的是相同的内核对象,使用相同的方法标识状态.估计是一个计数器吧~ 我觉得这个东西对今后的编程是很有启发~.

最后给出一个使用共享内存, Mutex, WaitForSingleObject的综合小例子.


//main process
HANDLE hMapping;
HANDLE hMutexMapping;
hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, /* SIZE */, /* NAME(CAN BE NULL) */);
hMutexMapping=CreateMutex(NULL, FALSE, /* NAME(CAN BE NULL)*/);
//
// Create Processes and do something
//

//sub process
HANDLE hMutexMapping;
HANDLE hMapping;
LPVOID pFile;
// get FileMapping and Mutex
hMapping = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, /* NAME */);
hMutexMapping = OpenMutex(MUTEX_ALL_ACCESS, FALSE, /* NAME */);
//wait for Mutex
WaitForSingleObject(hMutexMapping, INFINITE);
//get shared memory
pFile=MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//
// pFile is the Point to the shared data ,do changes here
//
UnmapViewOfFile(pFile);
ReleaseMutex(hMutexMapping);

No comments:

Post a Comment