C 检查aio_写入是否完成

C 检查aio_写入是否完成,c,unix,synchronization,aio,C,Unix,Synchronization,Aio,有没有办法检查给定文件是否没有AIO写入?我正在我的Unix课程上做一个项目,这将是一个无上下文(基于UDP)的国际象棋服务器,所有数据都必须存储在文件中。应用程序将是单进程和单线程的(AIO函数除外)。我的问题是: 1) 播放器一号发送一些数据,触发对文件的aio_写入操作,该过程开始 2) 玩家2请求从该文件读取的当前板状态,但如果之前的aio_写入尚未完成,则该文件不是最终文件,因此我不应读取,而是等待aio_写入结束 问题是,由于它是上下文无关的,所以我没有来自aio_write调用的a

有没有办法检查给定文件是否没有AIO写入?我正在我的Unix课程上做一个项目,这将是一个无上下文(基于UDP)的国际象棋服务器,所有数据都必须存储在文件中。应用程序将是单进程和单线程的(AIO函数除外)。我的问题是:

1) 播放器一号发送一些数据,触发对文件的aio_写入操作,该过程开始
2) 玩家2请求从该文件读取的当前板状态,但如果之前的aio_写入尚未完成,则该文件不是最终文件,因此我不应读取,而是等待aio_写入结束
问题是,由于它是上下文无关的,所以我没有来自aio_write调用的aiocb结构


此外,可能还有其他游戏(使用不同的文件)的aio_写入,我不需要在意,只有在特定文件当前正在写入的情况下。

它的上下文无关这一事实不应该阻止您保留一些状态信息

您可以保留上下文(我指的是
io\u上下文)并重用它(发送读取请求并等待它-
io\u getevents
)。表示它将请求推送到队列中,因此我相信它将保留操作顺序

或者,(如果您发现
io\u submit
没有保留顺序),您可以保持足够的状态,以知道写入操作处于挂起状态,并使用
io\u getevents
等待。那读书就安全了

我希望我没有误读你的问题

编辑

看来我确实误读了你的问题。您可能正在谈论POSIX
aio(7)
。我说的是真正的异步I/O(
libaio.h
)。POSIXAIO通常是使用线程实现的(这类线程很糟糕)


无论哪种方式,如果您可以等待事件(我认为您可以),您仍然可以这样做:保留一些状态以声明写入处于挂起状态,当有人想要读取时,请等待写入完成。

为什么要为此使用AIO?AIO的目的不是进程之间的同步。当由于磁盘负载(读取)或缓存压力(写入)而无法立即满足读写操作时,这纯粹是为了防止进程在内核空间中休眠。对于象棋游戏将要处理的此类小型事务,AIO的行为应与正常的
读取
写入
IO完全相同:所有操作都将立即完成,尽管开销稍大一些


如果您的目标是同步文件访问,您可以使用
fcntl
锁定,或者
mmap
锁定您的文件,并在文件中的某个位置包含互斥或信号量。

我想补充一点,与往常一样,NFS很奇怪,您不能依靠同步来正常工作。(虽然我认为如果两个进程都在同一台机器上也可以。)正如我写的是UNIX课程,其中一个要求是只使用异步输入输出:/sign。。。为什么教官在教POSIX中设计最糟糕、最无用的界面?我不认为AIO可以帮助您实现所需的同步,因为它不是一种同步方法…在花更多时间在课堂讲稿和其他内容上之后,我认为完成它的方法应该是文件锁定…您可以等待自己的事件,但我不知道如何等待由另一个应用程序触发的事件。从概念上讲,POSIXAIO所做的几乎都是在一个新线程中进行阻塞读写,并在完成时发出通知信号或回调。。。用一个非常丑陋的API。这不是可用于构建进程间同步的原语。@R。。我想他使用的是同一个过程——一个从客户端接收UDP消息的服务器。服务器正在使用AIO等待与自身同步。实际上,所有AIO操作都将立即进行,等待将立即返回。这是一个非常无用的练习。。。