所有API的官方路径:
https://docs.microsoft.com/en-us/windows/win32/api/heapapi/nf-heapapi-heapcreate
#1 ============== Windows服务 ==============
#2 ============== 异步输入/输出与完成端口 ==============
重叠I/O :线程发出 读/写或者其他I/O操作命令后继续执行。当线程需要I/O结果才能
继续时,它要么等待文件句柄,要么等待在ReadFile/WriteFile重叠结构中指定的一个事件带有回调函数的重叠I/O : 当I/O完成后自动执行回调函数。
不是说重叠I/O会一致阻塞,我们可以不尝试操作文件句柄,这样就不会被投入等待,但是我们
还是要等待某个事件来通知我们I/O已完成。这其实没啥用,而带有回调的I/O就不一样了,我们
可以随便干自己的事情,当I/O操作完成后回调函数会被立刻调用,这样我们就不需要等待哪个事件
通知我们I/O已经完成。APC 和 带有回调的重叠I/O很相似。
重叠I/O不能用于匿名管道。
所谓重叠 I/O 其实就是指在调用 I/O 函数的时候指定了 overlapped 标志,这个标志等同于
本次 I/O 操作为非阻塞调用。如果设置了回调函数,那么I/O完成后会执行回调函数,如果没有设置
,那么需要自行检测一个 overlapped 结构中的一个事件是否触发了。overlapped结构中的event的动作流程:当程序尽心了一次I/O调用时此事件会被立刻复位(设置为未传信状态),
当I/O操作完成时,该事件会被传信且 “ 一直池需要 另外一个I/O 操作使用它 ”。
也就是说,调用了带overlapped的ReadFileEx后,Event会被重置,然后立刻返回,当准备读完成后,Event会
被触发,如果我们想要读数据,正确的操作时先waitforsingleobject event,得到event后再调用一次Read操作。
其实第一次读相当于注册一个读操作给内核,当内核完成以后通知调用线程在读一次,这次读到的就是实际的数据,
第一次读会返回失败,但是错误码是IO PENDING,鉴于第一次读返回失败,其实从编码角度看也就是进行了一次读操作。需要注意:overlapped中的event必须是手动复位模式
注意:1)一个overlapped结构尽量只用于一个I/O操作,不要复用此结构
2)overlapped离开作用于后会自动释放,因此需要处理closehandle其中的event(真麻烦)
如果某个重叠I/O动作非常耗时间,那么可以通过CancelIoEx来取消这个重叠IO五个“可报警的”等待函数:
1)WaitForSingleObjectEx
2)WaitForMultipleObjectsEx
3)SleepEx
4)SignalObjectAndWait
5)MsgWaitForMultipleObjectsEx
#3 ============== Windows对象的安全 ==============几乎任何使用CreateXXXX 系统调用创建的对象都有安全属性参数。