grep 在 xv6 实现中的工作?

grep 在 xv6 实现中的工作?
char buf[1024];

void
grep(char *pattern, int fd)
{
  int n, m;
  char *p, *q;

  m = 0;
  while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){
    m += n;
    buf[m] = '\0';
    p = buf;
    while((q = strchr(p, '\n')) != 0){
      *q = 0;
      if(match(pattern, p)){
        *q = '\n';
        write(1, p, q+1 - p);
      }
      p = q+1;
    }
    if(p == buf)
      m = 0;
    if(m > 0){
      m -= p - buf;
      memmove(buf, p, m);
    }
  }
}

我在源代码grep()中找到了一个实现。xv6我认为源代码有问题。考虑这样的情况:有一个文件包含长度超过 1024 个字符的行,并且它在字节 {abccee....unix...}unix之后包含字符串(例如),1023th并且我们正在搜索该字符串。

现在,如果我们运行它,grep它将读取第一个1023字符,并且由于它没有找到任何换行符,因此'\n'它会通过设置丢弃缓冲区,m = 0然后下次当它读取该行的其余部分时,它会找到字符串unix并仅从第 1023 个字节开始打印..unix...} 但从逻辑上讲它应该打印整行,但它只是丢弃该行的前一部分。所以,我认为它不能正常工作。

注意:我正在考虑该行以第 0 个、第 1 个、第 2 个字节开头,依此类推......

答案1

是的,超过 1024 字节的行无法正确处理。 V6grep类似的限制

行限制为 256 个字符;较长的行被截断

相关内容