xv6の実装でgrepが機能しますか?

xv6の実装でgrepが機能しますか?
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文字より長い行を含むファイルがあり、unix{abccee....unix...}バイトの後に文字列(たとえば)が含まれていて、1023thその文字列を検索しています。

これでこれを実行すると、grep最初の1023文字を読み取って改行を見つけることができないので、'\n'設定でバッファを破棄し、m = 0次回の残りの行を読み取るときに文字列を見つけてunixバイトから始めて印刷します。 1023..unix...} しかし、論理的には行全体を印刷する必要がありますが、行の最初の部分だけを削除します。だから正しく動作しないようです。

注:0番目、1番目、2番目のバイトなどで始まる行を検討しています。

ベストアンサー1

はい、1024バイトを超える行は正しく処理されません。 V6grep同様の制限:

行制限は256文字です。長い行は切り捨てられます。

おすすめ記事