gpt4 book ai didi

c - aio_read from OS X 上的文件错误

转载 作者:太空狗 更新时间:2023-10-29 11:39:57 26 4
gpt4 key购买 nike

以下代码:

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

int main (int argc, char const *argv[])
{
char name[] = "abc";
int fdes;
if ((fdes = open(name, O_RDWR | O_CREAT, 0600 )) < 0)
printf("%d, create file", errno);

int buffer[] = {0, 1, 2, 3, 4, 5};
if (write(fdes, &buffer, sizeof(buffer)) == 0){
printf("writerr\n");
}

struct aiocb aio;
int n = 2;
while (n--){
aio.aio_reqprio = 0;
aio.aio_fildes = fdes;
aio.aio_offset = sizeof(int);
aio.aio_sigevent.sigev_notify = SIGEV_NONE;

int buffer2;
aio.aio_buf = &buffer2;
aio.aio_nbytes = sizeof(buffer2);

if (aio_read(&aio) != 0){
printf("%d, readerr\n", errno);
}else{
const struct aiocb *aio_l[] = {&aio};
if (aio_suspend(aio_l, 1, 0) != 0){
printf("%d, suspenderr\n", errno);
}else{
printf("%d\n", *(int *)aio.aio_buf);
}
}
}

return 0;
}

在 Linux 上工作正常(Ubuntu 9.10,使用 -lrt 编译),打印

1
1

但在 OS X(10.6.6 和 10.6.5,我已经在两台机器上测试过)上失败了:

1
35, readerr

这可能是由于 OS X 上的某些库错误,还是我做错了什么?

最佳答案

您需要调用aio_return(2)每个异步 I/O 操作恰好一次。根据该手册页上的注释,不这样做会泄漏资源,而且显然也会导致您的问题。在调用 aio_suspend 等待 I/O 完成后,确保调用 aio_return 以获取读取的字节数,例如:

const struct aiocb *aio_l[] = {&aio};
if (aio_suspend(aio_l, 1, 0) != 0)
{
printf("aio_suspend: %s\n", strerror(errno));
}
else
{
printf("successfully read %d bytes\n", (int)aio_return(&aio));
printf("%d\n", *(int *)aio.aio_buf);
}

另请记住 aio_read(2) 中的这些重要说明手册页(强调我的):

The Asynchronous I/O Control Block structure pointed to by aiocbp and the buffer that the aiocbp->aio_buf member of that structure references must remain valid until the operation has completed. For this reason, use of auto (stack) variables for these objects is discouraged.

The asynchronous I/O control buffer aiocbp should be zeroed before the aio_read() call to avoid passing bogus context information to the kernel.

关于c - aio_read from OS X 上的文件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com