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;
}
我正在寻找 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;
}