aio_write() 的简单示例

Simple example for aio_write()

我正在寻找 POSIX aio_write 函数的简单示例。

到目前为止我尝试了什么

以下不是太重要。直接跳转回答

下面的代码创建了一个文件,但没有向其中写入任何内容。 aio_errorreturns22(=quota exceeded,但是驱动器上有足够的space和r/w-permission)。

#include <aio.h>
#include <stdio.h>


char CONTENT[] = "asdf;";
const int LENGTH = 5;

struct aiocb createIoRequest(int fd,  
                            off_t offset, 
                            volatile void * content, 
                            size_t length){
    struct aiocb ret; // <-- not initialized. Will lead to an error ( see answer) 
    {
        ret.aio_fildes = fd;
        ret.aio_offset = offset;
        ret.aio_buf = content;
        ret.aio_nbytes = length;            
    }
    return ret;
}


int main(){

    FILE * file = fopen("outfile.txt","w");
    int fd = fileno(file);
    {    
        struct aiocb op  = createIoRequest(fd,0,CONTENT,LENGTH);        

        // schedule write
        // for valgrind mem leak output see comments from answer in
        //   
        int ret = aio_write(&op);
        printf("aio_write 1: %d\n",ret);

        // wait until everything is done
        {
            const struct aiocb * aiolist[1];
            aiolist[0] = &op;

            int ret = aio_suspend(aiolist,1,NULL);
            printf("aio_suspend: %d\n",ret);

            // report possible errors
            {
                ret = aio_error(&op);
                printf("errno 1: %d\n",ret);
            }
        }
    }
    fclose(file);


    return 0;
}

正在使用 valgrind 报告检查您的代码 Conditional jump or move depends on uninitialised value(s)

您的代码有问题

aiocb 未初始化。

例子

下面的示例不包含任何 "success"-检查(例如 file != NULL 等)。这是为了可读性。在生产代码中,您应该检查 return 值。

示例 1

下面的程序将asdf;写入outfile.txt。 aiocb 结构在 createIoRequest()

内部初始化
#include <aio.h>
#include <stdio.h>


char CONTENT[] = "asdf;";
const int LENGTH = 5;

struct aiocb createIoRequest(int fd,  
                            off_t offset, 
                            volatile void * content, 
                            size_t length){
    // create and initialize the aiocb structure.
    // If we don't init to 0, we have undefined behavior.
    // E.g. through sigevent op.aio_sigevent there could be 
    //      a callback function being set, that the program
    //      tries to call - which will then fail.
    struct aiocb ret = {0};
    {
        ret.aio_fildes = fd;
        ret.aio_offset = offset;
        ret.aio_buf = content;
        ret.aio_nbytes = length;            
    }
    return ret;
}


int main(){

    FILE * file = fopen("outfile.txt","w");
    int fd = fileno(file);
    {    
        struct aiocb op  = createIoRequest(fd,0,CONTENT,LENGTH);        

        // schedule write
        // for valgrind mem leak output see comments from answer in
        //   
        int ret = aio_write(&op);
        printf("aio_write 1: %d\n",ret);

        // wait until everything is done
        {
            const struct aiocb * aiolist[1];
            aiolist[0] = &op;

            int ret = aio_suspend(aiolist,1,NULL);
            printf("aio_suspend: %d\n",ret);

            // report possible errors
            {
                ret = aio_error(&op);
                printf("errno 1: %d\n",ret);
            }
        }
    }
    fclose(file);


    return 0;
}

示例 2

下面的程序简单地扩展了上面的程序以对文件进行两次异步写入

#include <aio.h>
#include <stdio.h>


char CONTENT[] = "asdf;";
const int LENGTH = 5;

struct aiocb createIoRequest(int fd,  
                            off_t offset, 
                            volatile void * content, 
                            size_t length){
    // create and initialize the aiocb structure.
    // If we don't init to 0, we have undefined behavior.
    // E.g. through sigevent op.aio_sigevent there could be 
    //      a callback function being set, that the program
    //      tries to call - which will then fail.
    struct aiocb ret = {0};
    {
        ret.aio_fildes = fd;
        ret.aio_offset = offset;
        ret.aio_buf = content;
        ret.aio_nbytes = length;            
    }
    return ret;
}


int main(){

    FILE * file = fopen("outfile.txt","w");
    int fd = fileno(file);
    {    
        struct aiocb op  = createIoRequest(fd,0,CONTENT,LENGTH);
        struct aiocb op2 = createIoRequest(fd,LENGTH,CONTENT,LENGTH);

        // schedule write
        // for valgrind mem leak output see comments from answer in
        //   
        int ret = aio_write(&op);
        printf("aio_write 1: %d\n",ret);
        ret = aio_write(&op2);
        printf("aio_write 2: %d\n",ret);        

        // wait until everything is done
        {
            const int OPs = 2;
            const struct aiocb * aiolist[OPs];
            aiolist[0] = &op;
            aiolist[1] = &op2;

            int ret = aio_suspend(aiolist,OPs,NULL);
            printf("aio_suspend: %d\n",ret);

            // report possible errors
            {
                ret = aio_error(&op);
                printf("errno 1: %d\n",ret);
                ret = aio_error(&op2);
                printf("errno 2: %d\n",ret);
                // error codes can be checked in <errno.h>
            }
        }
    }
    fclose(file);


    return 0;
}