2008-11-13 4 views
5

다음 호출은 스트림을 닫고 추가 입력을 허용하지 않으므로 스트림에서 입력을 기다리는 동안 오류가 발생하지만 모든 컴파일러/플랫폼에서 올바르다는 보장이 있습니까?/fclose가 표준 입력을 준수합니까?

close(fileno(stdin)); 
fclose(stdin); 
+1

fclose (stdin) 할 수 있습니다. 파일 핸들에서 close()를 호출합니다. –

답변

3

가능한 모든 운영 체제에서 올바른 것은 아닙니다. 그러나 fclose (stdin)를 호출하면 Windows 운영 체제뿐만 아니라 POSIX 호환 운영 체제에서도 작동하므로 현재 일반적으로 사용되는 모든 기능을 사용해야합니다.

이전 답변과 내 의견에 명시된 바와 같이 파일 핸들을 close로 호출 할 필요가 없습니다. fclose()는 모든 것을 적절히 닫습니다.

14

fileno (FILE *)를 닫지 마십시오. FILE은 버퍼링 객체입니다. 그것의 구현을 살펴보고 그 상태에 간섭하는 것은 다른 소프트웨어 모듈에서 유사한 오작동과 함께 오는 모든 경고와 위험을 수반합니다.

하지 마십시오.

AGH. 진지하게. 추잡한.

+5

사실 fclose() 전에 close()를 수행하면 플러시 할 데이터가있는 경우 fclose()를 실패하게 만들 수 있습니다. (더 일반적인 경우, close()와 fclose() 사이의 다른 코드가있는 곳에서 fclose()는 잘못된 파일에 쓸 수 있습니다!) –

+0

이것은 ... 기술적으로 질문에 대답하지 않습니다. . –

+0

이것은 : OP 코드의 동작은 정의되지 않습니다. fclose를 구현 한 결과 fd가 종료되었음을 감지 할 가능성은 거의 없습니다. close와 fclose 호출 사이에 다른 일이 발생했다면 또 다른 불쾌한 가능성이 있습니다 : 파일 설명자를 막 닫은 다음 open()을 호출하면 그 파일 설명자를 재사용 할 가능성이 높습니다. 기본 디스크립터에서 close를 호출하고 같은 인덱스를 가진 다른 디스크립터를 연 다음 fclose를 호출하면 어떻게됩니까? 그 마지막 open()의 fd는 확실히 나쁜 것입니다. – Sniggerfardimungus

17

fclose(stdin)매우 나쁜 일이입니다 정의되지 않은 동작을 호출 할 stdin (암시 적 또는 명시 적)의 추가 사용됩니다. 그것은 "입력 금지"하지 않습니다. 현재의 버퍼가 고갈 된 후

close(fileno(stdin))EBADF과 실패, stdin에서 입력에서 더 이상의 시도가 발생하지만 파일 FD 될 것입니다 경우에 다른 파일을 열 때까지만 # 0과 나쁜 일이 것 일어나는.

보다 강력한 방법이 될 수 있습니다 몇 가지 추가 오류 검사와

int fd = open("/dev/null", O_WRONLY); 
dup2(fd, 0); 
close(fd); 

합니다. 이렇게하면 현재 버퍼가 고갈 된 후 모든 읽기가 오류가 발생합니다. 오류가 아닌 EOF가되도록하려면 O_WRONLY 대신 O_RDONLY을 사용하십시오.