【发布时间】:2018-01-25 21:20:28
【问题描述】:
这可能看起来很傻,但是,我使用的是 libaio(而不是 posix aio),我可以在文件中写入一些内容,但我也在向文件中写入额外的内容。
我了解了iocb的缓冲区字段的对齐要求和数据类型。
这里是代码示例(只有相关的使用部分,用于表示)
aio_context_t someContext;
struct iocb somecb;
struct io_event someevents[1];
struct iocb *somecbs[1];
somefd = open("/tmp/someFile", O_RDWR | O_CREAT);
char someBuffer[4096];
... // error checks
someContext = 0; // this is necessary
io_setup(32, &someContext ); // no error checks pasted here
strcpy(someBuffer, "hello stack overflow");
memset(&somecb, 0, sizeof(somecb));
somecb.aio_fildes = somefd ;
somecb.aio_lio_opcode = IOCB_CMD_PWRITE;
somecb.aio_buf = (uint64_t)someBuffer;
somecb.aio_offset = 0;
somecb.aio_nbytes = 100; // // //
// I am avoiding the memeaign and sysconf get page part in sample paste
somecbs[0] = &somecb; // address of the solid struct, avoiding heap
// avoiding error checks for this sample listing
io_submit(someContext, 1, somecbs);
// not checking for events count or errors
io_getevents(someContext, 1, 1, someevents, NULL);
输出:
此代码确实创建了文件,并且确实写入了预期的字符串 你好堆栈溢出到文件/tmp/someFile。
问题:
文件 /tmp/someFile 还包含在预期字符串之后,串联, @^@^@^@^@^@^@^@^@^ 和文件本身的某些部分(代码部分),可以说是垃圾。
我可以肯定这是数据字段中的某个指针出错了,但无法破解。
- 如何使用 aio(而非 posix)将“hello world”准确且仅写入文件?
我知道目前并非所有文件系统都支持 aio 调用。我正在与之对抗的人确实支持。
编辑 - 如果你想要这次尝试的入门包,你可以从这里获得。
http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
编辑 2:粗心,我在文件中设置了更多的字节数,并且代码正在兑现它。简而言之,要在 iocb 的字节字段中写入 'hw' ,需要不超过 2 个字节。
【问题讨论】:
-
你想要的字符串的长度是 100 字节,还是可能更短?
-
/tmp/someFile的文件大小终于是100了吧? -
@Hasturkun 更短。
-
请注意,您设置为在
somecb.aio_nbytes = 100;中写入 100 个字节,我认为这是您的最终文件大小。您可能会写超出缓冲区的初始化部分。您可能希望在编写时使用实际的字符串长度。 -
1)
somecb.aio_buf = (uint64_t)someBuffer;:我看不出这里需要演员表。 2)struct iocb *somecbs[1];你不需要这个。 3)你假设零/空填充缓冲区。