我有一个C ++程序打开一个带有O_DIRECT标志的文件,并将一个大小为100 Mb的缓冲区写入一个带有写系统调用的文件。程序定义块大小等于512,并执行如下操作:
const int BLKSZ = 512;
const int MAXBUFSIZE = 100000000;
char buf[MAXBUFSIZE];// store data in this buffer and write it to file
size_t len;// number of bytes of buf is full
int fd = open(fName.c_str(), O_WRONLY | O_CREAT | O_APPEND | O_DIRECT , mode);
#ifdef DIRECTIO
This->remNAligNum = len % BLKSZ;
if(This->remNAligNum)
{
This->remNAlig = ((char *)buf + len);
len -= This->remNAligNum;
}
else
This->remNAlig = NULL;
#endif
char *buffOffset = (char *)buf;
int buffRem = len;
wr = 0;
while(1){
buffOffset += wr;
buffRem -= wr;
if(!buffRem)
break;
wr = write(fd, buffOffset, buffRem));
usleep(5);
}
此代码成功将数据写入文件但在下面的代码中读取系统调用无法从文件中读取任何数据并返回-1。
const int BLKSZ = 512;
const int MAXBUFSIZE = 100000000;
char buf[MAXBUFSIZE];
char tmpbuf[BLKSZ];
int fd = open(fName.c_str(), O_RDONLY | O_DIRECT, mode);
int ret2 = read(fd, tmpbuf, BLKSZ);
答案 0 :(得分:0)
写完全时调用close(fd)(在while()和open(只读)之间)。
答案 1 :(得分:0)
那已经解决了!问题是文件的访问权限。