当前位置: 技术问答>linux和unix
文件读写问题
来源: 互联网 发布时间:2015-12-31
本文导语: OS: LINUX 2.6 direct i/o 最后小于512字节怎么写入? 我是先关闭文件,再以非direct I/O 打开文件后加入末尾。 问题是如果小文件成功,文件到100M左右后,就错误了。 错误信息:Bad address #define _GNU_SOURCE #include #incl...
OS: LINUX 2.6
direct i/o 最后小于512字节怎么写入?
我是先关闭文件,再以非direct I/O 打开文件后加入末尾。 问题是如果小文件成功,文件到100M左右后,就错误了。
错误信息:Bad address
#define _GNU_SOURCE
#include
#include
#include
#include
#include
extern int errno;
int directio(char *in, char *out)
{
int i, j, ret;
int rfd, wfd;
unsigned int bsize;
char *block;
bsize = getpagesize() * 2500;
block = (char*)valloc(bsize);
printf("BlockSize: %u n", bsize );
rfd = open( in, O_RDONLY | O_LARGEFILE | O_DIRECT );
wfd = open( out, O_CREAT | O_WRONLY | O_LARGEFILE | O_DIRECT, 0666 );
i = 0;
while( 1 ){
ret = read( rfd, block, bsize );
if( 0 == ret )
break;
else if( bsize == ret )
i += write( wfd, block, bsize );
else{
j = ret % 512;
ret -= j;
i += write( wfd, block, ret );
close(wfd);
wfd = open( out, O_WRONLY | O_APPEND | O_LARGEFILE );
ret = write( wfd, block + i, j );
if( -1 == ret ){
printf( "direct io last write error : %sn", strerror( errno ) );
return -1;
}
break;
}
}
free(block);
close(rfd);
close(wfd);
return 0;
}
int main(int argc, char *argv[])
{
directio( "x", "xx" );
return 0;
}
程序输出信息:
BlockSize: 10240000
direct io last write error : Bad address
direct i/o 最后小于512字节怎么写入?
我是先关闭文件,再以非direct I/O 打开文件后加入末尾。 问题是如果小文件成功,文件到100M左右后,就错误了。
错误信息:Bad address
#define _GNU_SOURCE
#include
#include
#include
#include
#include
extern int errno;
int directio(char *in, char *out)
{
int i, j, ret;
int rfd, wfd;
unsigned int bsize;
char *block;
bsize = getpagesize() * 2500;
block = (char*)valloc(bsize);
printf("BlockSize: %u n", bsize );
rfd = open( in, O_RDONLY | O_LARGEFILE | O_DIRECT );
wfd = open( out, O_CREAT | O_WRONLY | O_LARGEFILE | O_DIRECT, 0666 );
i = 0;
while( 1 ){
ret = read( rfd, block, bsize );
if( 0 == ret )
break;
else if( bsize == ret )
i += write( wfd, block, bsize );
else{
j = ret % 512;
ret -= j;
i += write( wfd, block, ret );
close(wfd);
wfd = open( out, O_WRONLY | O_APPEND | O_LARGEFILE );
ret = write( wfd, block + i, j );
if( -1 == ret ){
printf( "direct io last write error : %sn", strerror( errno ) );
return -1;
}
break;
}
}
free(block);
close(rfd);
close(wfd);
return 0;
}
int main(int argc, char *argv[])
{
directio( "x", "xx" );
return 0;
}
程序输出信息:
BlockSize: 10240000
direct io last write error : Bad address
|
没看明白你要表达的意思,你看看i是不是放错位置了?
是不是应该放入while循环里面?
否则当i增加几次以后 block+i就超出了你分配的大小了,说是错误的地址,也是很正常的。
是不是应该放入while循环里面?
否则当i增加几次以后 block+i就超出了你分配的大小了,说是错误的地址,也是很正常的。