进程与线程的学习当然还没结束,R3的部分还差最后的多线程实例,以前写过的端口扫描的源码找不到了,晕,现在重写一个搜索删除文件的,这两天顺便熟悉下 MFC,MFC真是烦人,在上面花了不少时间。这个东东没准哪天会拿出来水下。。等熟悉了win的各种功能后会进入内核部分的学习,当然之前还需要系统学 下驱动编程。。
过两天去报BUPT的MSTC,没准能跟微软套套近乎=。=||,没什么了,之前的东东大多属于进程管理器,接下来的东东就是I/o管理器的啦~~
在win中,隐藏了各种设备在user mode的区别,它们包括:文件 目录 套接字 串口 并口等等 可以使用CreateFile (个别设备不用这个创建,如socket 和 cmd)
这里就以最简单的文件对象为例了,每一个文件内核对象保存一个文件指针,用于记录读取到的位置,可以手动设置。
1 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
2
3 {
4
5 TCHAR szFileName[]= _T("\\\\.\\C:\\Users\\Administrator\\Desktop\\FRISTDRIVER.C");
9 //打开文件
10
11 HANDLE hFile = CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_ALWAYS,NULL,NULL);
12
13
14
15 if (hFile == INVALID_HANDLE_VALUE)
16
17 ErrorCall();
18
19
20
21 //得到文件实际物理大小
22
23 ULARGE_INTEGER uli;
24
25 uli.LowPart = GetCompressedFileSize(szFileName,&uli.HighPart);
26
27 wprintf(_T("size is %d Bytes \n"),uli.QuadPart);
28
29
30
31 BYTE byBuff[100];
32
33 DWORD dwNumber;
34
35 //同步I/O模式读取文件
36
37 if (!ReadFile(hFile,(PVOID)byBuff,100,&dwNumber,NULL))
38
39 ErrorCall();
40
41
42
43 //设置文件指针,变化值为,也就是查询文件指针,之前读取了,所以返回x64
44
45 LARGE_INTEGER li={0};
46
47 SetFilePointerEx(hFile,li,&li,FILE_CURRENT);
48
49 wprintf(_T("offset is 0x%x \n"),li.QuadPart);
50
51
52
53 //文件指针移动M,设置为文件尾,扩充文件。
54
55 li.QuadPart=1024*1024*4;
56
57 SetFilePointerEx(hFile,li,&li,FILE_BEGIN);
58
59 SetEndOfFile(hFile);
60
61 uli.QuadPart=0;
62
63 uli.LowPart = GetCompressedFileSize(szFileName,&uli.HighPart);
64
65 wprintf(_T("size is %d Bytes \n"),uli.QuadPart);
71 system("pause");
72
73 return 0;
74
75 }
如果同步I/O等待时间过长,可以使用CancelSynchronousIo来取消这个操作,为了确保线程有THREAD_TERMINATE权限,最好先自己打开一遍。同步I/O比较无趣,异步就有点繁琐了,下面只是一个极为简单的例子,以异步方式进行I/O请求.
1 TCHAR szFileName[]= _T("\\\\.\\C:\\Users\\Administrator\\Desktop\\FRISTDRIVER.C");
2
3
4
5 //打开文件
6
7 HANDLE hFile = CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);
8
9 if (hFile == INVALID_HANDLE_VALUE)
10
11 ErrorCall();
12
13
14
15 BYTE byBuff[8000];
16
17
18
19 //异步I/O模式读取文件
20
21 OVERLAPPED ol={0};
22
23 ol.Offset = 0;
24
25 ol.OffsetHigh = 0;
26
27 ol.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
28
29
30
31 //异步调用
32
33 ReadFile(hFile,(PVOID)byBuff,7000,NULL,&ol);
34
35 do
36
37 {
38
39 wprintf(_T("reading... \n"));
40
41 } while (WAIT_TIMEOUT == WaitForSingleObject(ol.hEvent,0));
还可以使用CreateIoCompletionPort与设备对相关联
利用线程池可以对I/O操作进行优化,Vista重写了这方面的机制,不与以前的操作系统兼容。。。在需要大量的I/O操作之前不想搞这块=。=|||
线程池也是非常有用的机制,在异步调用方面有多种应用,可以提高多线程效率,如果哪天用到再详细写。