У меня есть функция, которая запускает задачу 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
и какего копия никогда не обновляется.Но я довольно потерян в этот момент.Любая помощь будет принята с благодарностью.
Заранее спасибо.