zoukankan      html  css  js  c++  java
  • Windows核心编程笔记:同步设备I/O与异步设备I/O 200404

    04/04工作内容

    Windows编程学习

    1.设置文件指针位置

    调用CreateFile会使系统创建一个文件内核对象来管理对文件的操作。在这个内核对象内部有一个文件指针,它是一个64位偏移量,表示应该在哪里执行下一次同步读取或写入操作。这个文件指针一开始被设为0,因此如果在调用CreateFile之后立即调用ReadFile,那么会从偏移量为0的地方读取文件。

    由于每个文件内核对象都有自己的文件指针,因此两次打开同一个文件得到的结果会略有不同。用一个文件对象来对文件进行操作不会影响到其它对象的文件指针。


    改变与文件对象相关联的文件指针:

    BOOL SetFilePointerEx(
        HANDLE    hFile,
        LARGE_INTERGER    liDistanceToMove,
        PLARGE_INTERGER    pliNewFilePointer,
        DWORD    dwMoveMethod
    )

    hFile:想要修改哪个文件内核对象的文件指针。

    liDistanceToMove:要把指针移动多少字节。系统会把指定的数值与当前值相加,因此使用负数可以将文件指针向后移动。

    dwMoveMethodFILE_BEGINFILE_CURRENTFILE_END

    pliNewFilePointerSetFilePointerEx更新了文件对象的文件指针之后,会在 pliNewFilePointer参数指向的LARGE_INTERGER 结构中返回文件指针的新植。可以传NULL

    注意:

    (1)将文件指针的值设为超过文件当前的大小是正当操作。除非是在该位置向文件写入数据或者调用SetEndOfFile,否则这样做不会增加文件在磁盘上的实际大小。

    (2)如果操作的文件是用FILE_FLAG_NO_BUFFERING标志打开的,那么文件指针只能被设为扇区大小的整数倍。


    2.设置文件尾

    SetEndOfFile函数会根据文件对象的文件指针当前所在的位置来截断文件的大小或增大文件的大小。


    3.最常用和最方便的对设备数据进行读/写的函数是ReadFileWriteFile

    BOOL ReadFile(
        HANDLE    hFile,
        PVOID    pvBuffer,
        DWORD    nNumBytesToRead,
        PDWORD    pdwNumBytes,
        OVERLAPPED*    pOverlapped
    );
    
    BOOL WriteFile(
        HANDLE    hFile,
        CONST VOID    *pvBuffer
        DWORD    nNumBytesToWrite,
        PWORD    pdwNumBytes,
        OVERLAPPED*    pOverlapped
    );

     

    ReadFile只能用于那些用GENERIC_READ标志打开的设备,WriteFile只能用于用GENETIC_WRITE标志打开的设备。


    4.强制系统将缓存数据写入到设备

    BOOL FlushFileBuffers(HANDLE hFile)


    5.同步I/O的取消

    同步I/O会阻塞住来自同一个线程的任何其它操作


    将一个给定线程尚未完成的同步I/O请求取消:

    BOOL CancelSynchronousIo(HANDLE hThread);

    参数hThread是由于等待同步I/O请求完成而被挂起的线程的句柄。这个句柄必须是用THREAD_TERMINATE访问权限创建的。

  • 相关阅读:
    Paratroopers 最大流问题 dinic算法 水平有待提高
    Food Delivery 区间dp
    D
    Codeforces 1282A Temporarily unavailable
    PAT 顶级 1017 The Best Peak Shape (35分)(最长上升子序列)
    POJ 2217 Secretary(后缀数组+高度数组)
    团体程序设计天梯赛 L1-011~L1-015
    PAT顶级解题目录
    PAT顶级 1005 Programming Pattern (35分)(后缀数组+基数排序 或 字符串哈希)
    团体程序设计天梯赛 L1-006~L1-010
  • 原文地址:https://www.cnblogs.com/Toya/p/12633681.html
Copyright © 2011-2022 走看看