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 catokumaya 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ı catve daha stdoutönce temizlediğim gerçeği göz önüne alındığında, freadbu C kodunun bir döngüde okumaya ve yazmaya devam etmesini beklerdim.
Bu iki davranış nasıl tutarlıdır? catYukarıdaki mekanizma neden olmasa da hangi mekanizma neden döngüler açıklıyor ?
cat x >> xHataya neden olan fikri seviyorum ; ancak bu komut Kernighan ve Pike'ın Unix kitabında alıştırma olarak önerilmektedir.
catbü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?