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자입니다. 긴 줄은 잘립니다.