source

C 프로그램에서 fclose()를 호출하지 않으면 어떻게 됩니까?

goodcode 2022. 7. 26. 23:41
반응형

C 프로그램에서 fclose()를 호출하지 않으면 어떻게 됩니까?

우선 fopen()으로 파일을 열고 닫지 않는 것은 매우 무책임하고 잘못된 형식이라는 것을 알고 있습니다.이건 단순한 호기심일 뿐이니, 저를 즐겁게 해 주세요:)

C 프로그램이 많은 파일을 열어놓고 닫지 않으면 결국 fopen()이 실패한다는 것을 알고 있습니다.코드 자체 이외에 문제를 일으킬 수 있는 다른 부작용은 없습니까?예를 들어 파일 하나를 열고 닫지 않고 종료하는 프로그램이 있는 경우 프로그램을 실행하는 사람에게 문제가 발생할 수 있습니까?이러한 프로그램에서는 메모리, 파일 핸들 등의 누수가 발생합니까?프로그램이 끝나면 다시 그 파일에 접속하는 데 문제가 있을 수 있습니까?프로그램을 여러 번 연속으로 실행하면 어떻게 됩니까?

프로그램이 실행되고 있는 동안 파일을 닫지 않고 계속 열면 프로세스에서 사용할 수 있는 파일 기술자/핸들이 부족해지고 파일을 더 열려고 하면 결국 실패합니다.Windows 에서는, 디폴트에서는 파일이 배타적 공유 모드로 열려 다른 프로세스가 파일을 열지 않기 때문에, 다른 프로세스에서 열려 있는 파일을 열거나 삭제할 수도 없습니다.

프로그램이 종료되면 운영체계가 정리됩니다.프로세스를 종료할 때 열어둔 파일을 닫고 필요한 다른 정리를 수행합니다(예를 들어 파일이 delete-on-close로 표시되어 있는 경우 파일은 삭제됩니다.이러한 작업은 플랫폼에 따라 다릅니다).

그러나 또 하나 주의해야 할 문제는 버퍼링된 데이터입니다.대부분의 파일 스트림은 데이터를 디스크에 쓰기 전에 메모리에 버퍼링합니다.사용하시는 경우FILE*라이브러리의 에는 두가지 . stdio 이 이 、 트 、 음 、 음 、 음음음음음음음음 음음음음음음 음음 streams streams streams streams 。

  1. 함수를 호출하거나 에서 복귀하여 프로그램이 정상적으로 종료되었습니다.main으로 콜한다)exit(3)를 참조해 주세요.
  2. 프로그램이 비정상적으로 종료되었습니다.또는 호출, 신호/예외로 인한 정지 등이 원인일 수 있습니다.

프로그램이 정상적으로 종료된 경우 C 런타임은 열려 있던 버퍼링된 스트림을 모두 플러시합니다.를 퍼퍼이에 경우FILE*안 씻겨져 나갔으면 일반 출구에서도 씻겨질 거야

반대로 프로그램이 비정상적으로 종료된 경우 버퍼링된 데이터는 플러시되지 않습니다.프로세스가 종료되면 OS는 "어머나, 당신은 파일 기술자를 열어두었군요, 닫는 게 좋겠어요"라고만 표시됩니다.프로그램이 디스크에 쓰려고 했지만 쓰지 않은 메모리 어딘가에 랜덤 데이터가 있다는 것을 전혀 알지 못합니다.그러니 조심하세요.

에서는 C를 호출하는 것이 C를 호출하는 있습니다.exit하게 (''에서main는, all open(모두 열림)의 이 됩니다.FILE에 의해 오브젝트fclose기입 에러를 검출할 기회가 없어지는 것 이외에는, 이 조작은 문제 없습니다.

편집: 비정상 종료에 대한 보장은 없습니다.aborta failed, a.assert기본 동작으로 프로그램을 비정상적으로 종료하는 신호를 수신합니다(이러한 신호는 반드시 존재하지 않습니다).또, 그 외의 실장 정의 수단도 있습니다).다른 사람들이 말했듯이, 최신 운영체제는 열려 있는 OS 수준의 파일 핸들 등 외부에서 볼 수 있는 모든 리소스를 청소합니다. 단,FILE이 경우 는 플래시되지 않을 수 있습니다.

비정상 종료 시 외부에서 볼 수 있는 리소스를 청소하지 않은 OS도 있습니다.또한 커널 코드와 사용자 코드 사이 또는 개별 사용자 공간 간의 하드 권한 경계를 적용하지 않는 경향이 있습니다.단, 이러한 경계를 설정하지 않으면 모든 OS에서 안전하게 제거할 수 없는 경우가 있기 때문입니다.예를 들어 MS-DOS에서 열린 파일 테이블에 가비지를 쓰면 어떻게 되는지 생각해 보십시오.

제어 하에 종료하는 경우, 시스템콜을 사용하거나 에서 복귀하는 경우main()열린 파일 스트림은 플러시 후 닫힙니다.C 표 POSIX 。

제어 불능 상태(코어 덤프, SIGKILL) 등을 종료하거나 또는 를 사용하는 경우 열려 있는 파일스트림은 플래시 되지 않습니다(단, 파일 기술자가 있는 POSIX와 같은 시스템에서는 파일 기술자가 필수적이지 않습니다).주의:_Exit()C99 규격에 따라 의무화되어 있지만_exit()는 POSIX에 의해 의무화되어 있습니다(단, POSIX 시스템에서는 동일하게 동작합니다).파일 디스크립터는 파일스트림과는 별개입니다.POSIX 페이지의 「프로그램 종료의 결과」에 대한 설명을 참조해 주세요._exit()Unix에서 프로그램이 종료되면 어떻게 되는지 확인합니다.

프로세스가 종료되면 대부분의 최신 운영체제(특히 커널)에서 모든 핸들 및 할당된 메모리가 해방됩니다.

언급URL : https://stackoverflow.com/questions/8175827/what-happens-if-i-dont-call-fclose-in-a-c-program

반응형