Linux系统调用aio_write()失败,错误代码为22(EINVAL)

时间:2015-04-27 07:48:31

标签: c++ linux system-calls aio aio-write

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

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

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

我怀疑线程在黑盒子里工作的方式发生了变化。这是我怀疑导致这个问题(我找不到任何其他解释)。

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

只是为了澄清,当我将黑盒子替换为旧版本时,使用相同的测试实用程序它可以正常工作....(我还测试了输入参数,因为看到它们与坏版本输入参数匹配)。

1 个答案:

答案 0 :(得分:2)

您可以在文件夹linux-kernel-source/fs/aio.c

中查看linux源代码中的aio实现

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