2013-06-04 17 views
3

程序可能首先发出一个异步I/O操作,其中aio_read()aio_write()然后调用exit()自行终止。执行异步I/O操作时退出

... 
aio_write(aiocbp); 
exit(0); 

我的问题是,将exit()呼叫等待,直到异步I/O完成或计划将直接终止?

回答

4

我相信,在标准的相关语言是:

过程终止的后果

所有的文件描述符,目录流,转换描述符和消息清单描述符在调用进程中打开的应被关闭。

来源:http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html

和:

当存在针对法尔兹杰出的取消,异步I/O操作时关闭()被调用时,该I/O操作可能会被取消。未被取消的I/O操作完成,就好像close()操作尚未发生一样。所有未取消的操作应完成,就好像close()被阻塞直到操作完成。 close()操作本身不需要阻塞等待这样的I/O完成。是否有任何I/O操作被取消,并且该I/O操作可能被取消的close(),是实现定义。

来源:http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html

因此,它是不明;未完成的操作被取消,或者操作阻塞直到完成。

+1

如果一个实现的'的atexit()'处理程序,明确提出'关闭()'上挂起的异步I描述符/ O操作,然后检查每个异步I/O状态与'则aio_error()',现在看来,这总是被允许的,然后一些返回'ECANCELED'和其他人返回成功。我会想象那么,该标准旨在尽最大努力,取消执行,但也承认比赛条件,即实现不必尝试修复。 – jxh

+0

这是一个非常有用的解释。 –

+0

注意困惑的一点是,我所提供的第一引证认为“应被关闭”,而不是“应当由'close'仿佛只有”留位模糊的。如果我没有记错,奥斯汀集团计划在某个时候弄清楚这个问题,但我不具备参考得心应手。 –