1

我有一个使用 linux aio_write 和 aio_read 的测试实用程序。这个测试实用程序包装了我的静态库并对其进行测试。这个库是多线程的黑盒。

到目前为止,它运行良好。但是现在我们对这个黑盒做了很大的改变,这会导致测试实用程序在提交第一个 IO 时立即失败。此 IO 返回 errno 22 == EINVAL。

根据 aio_write 手册页,如果以下字段之一无效,则会发出此错误 --> aio_offset, aio_reqprio, aio_nbytes。我在 gdb 中运行它并测试它们的值,只要与struct aiocb *输入参数中的所有其他值一样。我的结论是输入的参数都是有效的。

我怀疑线程在黑盒内的工作方式发生了一些变化。这就是我怀疑导致此问题的原因(我找不到任何其他解释)。

我真正想了解的是:哪些情况会导致 aio_write() 返回 EINVAL 错误代码???

只是为了澄清一下,当我将黑盒替换为旧版本时,使用相同的测试实用程序它工作正常......(我还在这里测试了输入参数,因为它们与错误版本的输入参数匹配)。

4

1 回答 1

2

您可以在文件夹中查看linux源代码中的aio实现linux-kernel-source/fs/aio.c

可悲的是,有很多地方 -EINVAL 返回。正如@myaut 在他的评论中提到的,我建议你使用strace. 另一种解决方案是修改代码,编译它并检查它失败的地方。

于 2015-04-27T09:24:21.417 回答