【发布时间】:2015-01-04 15:26:15
【问题描述】:
我有一个 C++ 程序,它打开一个带有 O_DIRECT 标志的文件,并将一个大小为 100 Mb 的缓冲区写入一个带有 write 系统调用的文件。该程序定义了一个等于 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);
【问题讨论】:
-
read() 返回 -1 错误号是什么?
-
你检查
open()是否成功?如果不是,返回码是什么?read()调用返回 -1 后,errno的值是多少? -
len从未初始化。 -
@philant,-1 表示从文件描述符读取时中断。
-
如果
read()返回-1然后尝试打印:std::cout << std::strerror(errno) << '\n';