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文字です。長い行は切り捨てられます。