다음 bash 명령은 무한 루프로 들어갑니다.
$ echo hi > x
$ cat x >> x
나는 그 추측 할 수 cat
읽기 계속 x
이 표준 출력에 쓰기 시작 후. 그러나 혼란스러운 것은 고양이에 대한 테스트 구현이 다른 동작을한다는 것입니다.
// 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;
}
내가 달리면 :
$ make mycat
$ echo hi > x
$ ./mycat x >> x
반복 되지 않습니다 . 동작 cat
과 stdout
이전에 플러시하고 있다는 사실을 fread
다시 호출하면이 C 코드가 계속해서 읽고 쓰기를 기대합니다.
이 두 행동은 어떻게 일치합니까? cat
위의 코드가 아닌 루프가 반복되는 이유는 무엇입니까 ?
cat x >> x
오류 를 일으키는 아이디어를 좋아한다 . 그러나이 명령은 Kernighan 및 Pike의 Unix 책에서 연습으로 제안됩니다.
cat
대부분 stdio 대신 시스템 호출을 사용합니다. stdio를 사용하면 프로그램이 EOFness를 캐싱 할 수 있습니다. 4096 바이트보다 큰 파일로 시작하면 무한 루프가 발생합니까?