【问题标题】:Linux read systemcall does not read from fileLinux读取系统调用不从文件中读取
【发布时间】: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';

标签: c++ linux file


【解决方案1】:

写完时调用close(fd)(在while()和open(只读)之间)。

【讨论】:

    【解决方案2】:

    解决了!问题是文件的访问权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多