了解系统级别的读写功能

时间:2019-02-24 03:36:45

标签: c++ linux

由于对std iostream和stdio的不满意,我决定创建自己的io库。这对我的教育有好处。

但是我有一个小问题。在终端文件描述符上运行时,Linux read()直到换行才返回。因此,如果我要求输入10个字节,即使输入20个字节也不会返回。更糟糕的是,那10个额外的字节没有记录在我通过的缓冲区中。

那10个额外的字节怎么了? Linux是否有用于读取的缓冲区? 我可以访问此缓冲区而不提供自己的缓冲区吗?

1 个答案:

答案 0 :(得分:-1)

因此,Linux终端的默认行为是行缓冲。像this answer之类的东西可以一次读取一个字符(如果您想要的话)。

要回答有关获取其他10个字节的问题,如果再次读取,它将返回其余的字节。以下示例演示了多个顺序读取。如果在提示符下输入10个以上的字符,将进行第二次读取而不会阻塞,并返回从10到19的字符。将不会打印从0开始的从0开始的字符。

#include <unistd.h>
#include <stdio.h>

int main(int argc, char** argv)
{
  int read1Count = 0;
  int read2Count = 0;
  char pBuffer[20];
  printf("Provide input: ");
  // flush stdout because buffering...
  fflush(NULL)
  read1Count = read(1, pBuffer, 10);

  // flush stdout because buffering...
  fflush(NULL)
  printf("Provide input: ");
  read2Count = read(1, pBuffer + 10, 10);

  printf("\nRead 1: '");
  if (read1Count < 0)
  {
    perror("Error on first read");
  }

  for (int i = 0; i < read1Count; i++)
  {
    printf("%c", pBuffer[i]);
  }

  printf("'\nRead 2: '");
  if (read2Count < 0)
  {
    perror("Error on second read");
  }

  for (int i = 0; i< read2Count; i++)
  {
    // We started the second read at pBuffer[10]
    printf("%c", pBuffer[i + 10]);
  }

  printf("'\n");
}

编译并运行它,我看到了

Provide input: 12345678910 Provide input: Read 1: '1234567891' Read 2: '0 '