Я пытаюсь запустить некоторый код, основанный на этом примере libaio:
https://oxnz.github.io/2016/10/13/linux-aio/#example-1
Я добавил флаг O_DIRECT в соответствии с документацией libaio.
Кажется, он работает на моем настольном компьютере с Ubuntu 16.04 (привет пишется в /tmp/test).
Однако, когда я компилирую и запускаю один и тот же пример в Docker-контейнере, в файл ничего не записывается. при запуске внутри GDB я вижу, что событие читается io_getevents и результат устанавливается в -22 (EINVAL).
Есть идеи?
Это мой модифицированный код
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <libaio.h>
int main() {
io_context_t ctx;
struct iocb iocb;
struct iocb * iocbs[1];
struct io_event events[1];
struct timespec timeout;
int fd;
fd = open("/tmp/test", O_WRONLY | O_CREAT | O_DIRECT) ;
if (fd < 0) err(1, "open");
memset(&ctx, 0, sizeof(ctx));
if (io_setup(10, &ctx) != 0) err(1, "io_setup");
const char *msg = "hello";
io_prep_pwrite(&iocb, fd, (void *)msg, strlen(msg), 0);
iocb.data = (void *)msg;
iocbs[0] = &iocb;
if (io_submit(ctx, 1, iocbs) != 1) {
io_destroy(ctx);
err(1, "io_submit");
}
while (1) {
timeout.tv_sec = 0;
timeout.tv_nsec = 500000000;
int ret = io_getevents(ctx, 0, 1, events, &timeout);
printf("ret=%d\n", ret);
if (ret == 1) {
close(fd);
break;
}
printf("not done yet\n");
sleep(1);
}
io_destroy(ctx);
return 0;
}