gpt4 book ai didi

c++ - aio_write() 总是失败并出现错误 EINVAL

转载 作者:行者123 更新时间:2023-11-28 07:05:22 25 4
gpt4 key购买 nike

我正在尝试使用 aio_write(1) 函数。下面的代码是我的程序。但是,aio_write() 总是返回 EINVAL。

看了EINVAL的错误原因:aio_offset、aio_reqprio、aio_nbytes中的一个或多个无效。但是,我无法弄清楚我设置的值不正确的原因!

有人能帮忙吗?

[更新] 此代码是可编译和可运行的!但是结果不正确!我认为这是因为 buffer_out 在写入文件之前被覆盖了。有没有更好更简洁的方法来做到这一点? aio_error(1) 是可以查询到的,但是像忙等待一样影响性能。

有没有更好的方法来避免缓冲区被覆盖并保持速度?

#include <iostream>
#include <cstring>
#include <aio.h>
#include <stdlib.h>
#include <stdio.h>
#include <sstream>
#include <errno.h>
using namespace std;

#define true 1
#define false 0

int main()
{
int i = 0;
int offset = 0, fd_offset = 0;
int slen = 0;
char* buffer, *buffer_out;
int buffer_size = 30;
int is_first_write = true;

struct aiocb aio_param;
int fd_out = open("result.log", O_APPEND | O_RDWR);

buffer = (char*) malloc(buffer_size);
buffer_out = (char*) malloc(buffer_size);
memset(buffer, 0, buffer_size);
memset(buffer_out, 0, buffer_size);

for( i = 0; i < 10; i++)
{
stringstream ss;
ss << "LOG *****" << i << "-" << "********\n";
slen = strlen(ss.str().c_str());
//cout<<"written to offset: " << offset << endl;
//buffer is not large enough to take the current string
if(offset + slen > buffer_size)
{
//write the current buffer content (< 4K) into the file
memset(&aio_param, 0, sizeof(aio_param));
aio_param.aio_fildes = fd_out;
aio_param.aio_offset = fd_offset;
while( aio_error(&aio_param) != 0 && is_first_write == false ) {cout << "wait for the previous one finish" <<endl;}
aio_param.aio_buf = memcpy(buffer_out, buffer, buffer_size); //the buffer_out has to be written before it's copied to again!
aio_param.aio_nbytes = offset;
//aio_offset = ? should be the end of file for O_APPEND mode
aio_param.aio_sigevent.sigev_notify = SIGEV_NONE;
if( aio_write(&aio_param) == -1 )
{
cout<<"ERR: aio_write()==-1"<<endl;
cout<<"errno:" << errno <<endl;
return 1;
}else{
is_first_write = false;
fd_offset += offset;
cout<<"aio_write()" << offset << " bytes succeed at file offset " << fd_offset<<endl;
offset = 0;
// sleep(1);
//clean the buffer
memset(buffer, 0, buffer_size);
}
}
//write the current string to the buffer
memcpy(buffer + offset, ss.str().c_str(), slen);
offset += slen;
}
close(fd_out);
return 0;

}

错误的结果是:

LOG *****2-********
LOG *****4-********
LOG *****4-********
LOG *****4-********
LOG *****5-********
LOG *****5-********
LOG *****6-********
LOG *****8-********

(应该是0到8,不能重复。)

最佳答案

由于您没有分配 aio_param 的所有值(并且它在堆栈上未初始化),我建议在使用前将其清零:

memset(&aio_param, 0, sizeof(aio_param));

此外,我认为您可能想要设置 aio_offset

关于c++ - aio_write() 总是失败并出现错误 EINVAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21844284/

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