I/O

        进程与线程的学习当然还没结束,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操作之前不想搞这块=。=|||

线程池也是非常有用的机制,在异步调用方面有多种应用,可以提高多线程效率,如果哪天用到再详细写。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值