首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >aio_write()总是失败,错误为EINVAL

aio_write()总是失败,错误为EINVAL
EN

Stack Overflow用户
提问于 2014-02-18 04:18:16
回答 1查看 584关注 0票数 0

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

我阅读了EINVAL的错误原因:一个或多个aio_offset、aio_reqprio、aio_nbytes无效。但是,我不知道为什么我设置的值是不正确的!

有人能帮忙吗?

更新这段代码是可编译的和可运行的!但结果是不正确的!我认为这是因为buffer_out在写入文件之前就被覆盖了。有什么更好、更整洁的方法吗?aio_error(1)可以被查询,但它就像忙碌的等待,损害了性能。

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

代码语言:javascript
复制
#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;

}

不正确的结果是:

代码语言:javascript
复制
LOG *****2-********
LOG *****4-********
LOG *****4-********
LOG *****4-********
LOG *****5-********
LOG *****5-********
LOG *****6-********
LOG *****8-********

(应该从0到8,没有任何重复)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 04:27:02

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

代码语言:javascript
复制
memset(&aio_param, 0, sizeof(aio_param));

另外,我想你可能想要设置aio_offset

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21844284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档