C 跟踪 aio_read 任务
C keep track of aio_read task
我有一个启动 aio_read
任务和 returns 主程序的函数。
我想定期检查任务是否完成以关闭文件描述符并可能通知用户。
我目前的方法是声明一个 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
,我总是会得到
At least one AIO task is in progress
留言。即使明明任务已经完成
我想这可能是因为我在 aio_error
是 EINPROGRESS
的那一刻传递了 struct aiocb
的副本并且作为它的副本它永远不会得到更新。但此刻我很迷茫。任何帮助将不胜感激。
提前谢谢你。
您需要调用 aio_suspend()
来处理 i/o 已经完成的事情,否则 aio_error()
等永远不会 return 不同。参见 https://github.com/ned14/llfio/blob/master/include/llfio/v2.0/detail/impl/posix/io_service.ipp#L290。
我有一个启动 aio_read
任务和 returns 主程序的函数。
我想定期检查任务是否完成以关闭文件描述符并可能通知用户。
我目前的方法是声明一个 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
,我总是会得到
At least one AIO task is in progress
留言。即使明明任务已经完成
我想这可能是因为我在 aio_error
是 EINPROGRESS
的那一刻传递了 struct aiocb
的副本并且作为它的副本它永远不会得到更新。但此刻我很迷茫。任何帮助将不胜感激。
提前谢谢你。
您需要调用 aio_suspend()
来处理 i/o 已经完成的事情,否则 aio_error()
等永远不会 return 不同。参见 https://github.com/ned14/llfio/blob/master/include/llfio/v2.0/detail/impl/posix/io_service.ipp#L290。