簡體   English   中英

在Docker容器中運行時的結果不同

[英]Different results when running inside a docker container

我正在嘗試基於此libaio示例運行一些代碼: https ://oxnz.github.io/2016/10/13/linux-aio/#example-1

我根據libaio的文檔添加了O_DIRECT標志。 它似乎可以在我的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;
}

容器內的文件系統可能與主機的文件系統不同(在現代設置中可能是overlayfs但在較舊的系統上可能是aufs )。 為了使O_DIRECT在開放的環境中工作,設備/文件系統必須至少“支持”它(請注意引號),並且容器的文件系統可能不支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM