我正在使用ctypes模块在Python中使用Windows DLL API 编写基于IO完成端口的服务器(此处为源代码).但这是API的直接用法,这个问题针对的是那些了解IOCP而不是Python的人.
据我了解CreateIoCompletionPort的文档,当您使用文件句柄(在我的情况下是套接字)调用此函数时,您指定了"用户定义的"完成键,您正在与创建的IOCP关联.当您调用GetQueuedCompletionStatus时,您将获得一个完成键值以及指向重叠对象的指针.完成键应标识重叠的对象和请求已完成的内容.
但是,假设我在带有重叠对象的CreateIoCompletionPort调用中传入100作为完成键.当相同的重叠对象完成其IO并且它通过GetQueuedCompletionStatus返回时,伴随它的完成键要大得多,并且与原始值100没有相似之处.
我误解了完成键是如何工作的,或者我在上面链接的源代码中是否做错了?
我想读取非块模式的文件.所以我在下面做了
import fcntl
import os
fd = open("./filename", "r")
flag = fcntl.fcntl(fd.fileno(), fcntl.F_GETFD)
fcntl.fcntl(fd, fcntl.F_SETFD, flag | os.O_NONBLOCK)
flag = fcntl.fcntl(fd, fcntl.F_GETFD)
if flag & os.O_NONBLOCK:
print "O_NONBLOCK!!"
Run Code Online (Sandbox Code Playgroud)
但价值flag仍然代表0.为什么......?我想我应该根据改变os.O_NONBLOCK
当然,如果我调用fd.read(),它会在read()处被阻塞.