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바이트보다 큰 줄은 올바르게 처리되지 않습니다. V6 grep에는유사한 제한 사항:

줄 제한은 256자입니다. 긴 줄은 잘립니다.

관련 정보