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 个字符;较长的行被截断