C отслеживать задачу aio_read - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть функция, которая запускает задачу aio_read и возвращается в основную программу.

Я хочу периодически проверять, завершена ли задача, чтобы закрыть дескриптор файла и, возможно, уведомить пользователя.

Мой текущий подход заключается в объявлении struct, который содержит struct aiocb задачи и дескриптор файла.Добавление его в глобальный массив и проверка, работает ли какая-либо задача со следующим (функция aio_check):

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <aio.h>
#include <unistd.h>

#include "aioqueue.h"

void aio_add(struct aiocb a, int fd) {
    for (int i = 0; i < MAX; i++) {
        if (aio_array[i].valid == 0) {
            aio_pack tmp;
            tmp.cb = a;
            tmp.fd = fd;
            tmp.valid = 1;
            aio_array[i] = tmp;

            printf("request enqueued\n");
            return;
        }
    }
    printf("This shell cannot keep track of so many IO operations :/ \n");
}

void aio_check() {
    for (int i = 0; i < MAX; i++) {
        // wait until the request has finished
        if(aio_array[i].valid) {
            if (aio_error(&aio_array[i].cb) != EINPROGRESS) {
                int nleidos = aio_return(&aio_array[i].cb);

                if (nleidos != -1)
                    printf("AIO Task finished: %d B\n", nleidos);
                else
                    printf("Error!");

                close(aio_array[i].fd); 
                aio_array[i].valid = 0; 
            } else {
                printf("At least one AIO task is in progress\n");           
            }
        }
    }
}

и код для aioqueue.h

#define MAX 10

typedef struct {
    struct aiocb cb;
    int fd;
    int valid;
} aio_pack;

aio_pack aio_array[MAX];

void aio_add(struct aiocb a, int fd);
void aio_check();

Проблема заключается в том, чтоесли я вызываю aio_check после того, как добавляю задачу, я всегда получаю сообщение

По крайней мере, одна задача AIO выполняется

.Даже если ясно, что задание завершено.

Я полагаю, это может быть связано с тем, что я передаю копию struct aiocb в момент, когда aio_error равен EINPROGRESS и какего копия никогда не обновляется.Но я довольно потерян в этот момент.Любая помощь будет принята с благодарностью.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 декабря 2018

Вам нужно позвонить aio_suspend(), чтобы обработать то, что ввод / вывод завершен, иначе aio_error() и т. Д. Никогда не вернутся по-другому.Смотри https://github.com/ned14/llfio/blob/master/include/llfio/v2.0/detail/impl/posix/io_service.ipp#L290.

...