Aşağıdaki bash komutları bir infinte döngüsüne girer:
$ echo hi > x
$ cat x >> x
Sanırım stdout'a yazmaya başladıktan sonra da cat
okumaya devam ediyor x
. Bununla birlikte, kafa karıştırıcı olan şey, kedinin kendi test uygulamamın farklı davranışlar göstermesidir:
// mycat.c
#include <stdio.h>
int main(int argc, char **argv) {
FILE *f = fopen(argv[1], "rb");
char buf[4096];
int num_read;
while ((num_read = fread(buf, 1, 4096, f))) {
fwrite(buf, 1, num_read, stdout);
fflush(stdout);
}
return 0;
}
Eğer koşarsam:
$ make mycat
$ echo hi > x
$ ./mycat x >> x
It does not döngü. Davranışları cat
ve daha stdout
önce temizlediğim gerçeği göz önüne alındığında, fread
bu C kodunun bir döngüde okumaya ve yazmaya devam etmesini beklerdim.
Bu iki davranış nasıl tutarlıdır? cat
Yukarıdaki mekanizma neden olmasa da hangi mekanizma neden döngüler açıklıyor ?
cat x >> x
Hataya neden olan fikri seviyorum ; ancak bu komut Kernighan ve Pike'ın Unix kitabında alıştırma olarak önerilmektedir.
cat
büyük olasılıkla stdio yerine sistem çağrıları kullanır. Stdio ile programınız EOFness'i önbelleğe alıyor olabilir. 4096 bayttan daha büyük bir dosyayla başlarsanız, sonsuz bir döngü elde edersiniz?