Что произойдет, если вы выйдете из программы, не выполнив fclose()?

Вопрос:

Что произойдет, если я выйду из программы, не закрыв файлы?

Происходят ли какие-то плохие вещи (например, какой-то массив файловых дескрипторов уровня ОС не освобождается ..?)

И на ответ один и тот же в обоих случаях

  • запрограммированный выход
  • неожиданная авария

Примеры кода:

Под запрограммированным выходом я имею в виду что-то вроде этого:

int main(){
    fopen("foo.txt","r");
    exit(1);
}

Под неожиданным сбоем я имею в виду что-то вроде этого:

int main(){
    int * ptr=NULL;
    fopen("foo.txt","r");
    ptr[0]=0;  // causes segmentation fault to occur
}

P.S.

Если ответ зависит от языка программирования, я хотел бы узнать о C и C++.

Если ответ зависит от ОС, то меня интересует поведение Linux и Windows.


person mks    schedule 10.09.2011    source источник


Ответы (3)


Это зависит от того, как вы выходите. В контролируемых обстоятельствах (через exit() или возврат от main()) данные в (выходных) буферах будут очищены, а файлы закрыты упорядоченным образом. Другие ресурсы, которые были у процесса, также будут высвобождены.

Если ваша программа выйдет из-под контроля или вызовет одну из альтернативных _exit() или _Exit() , то система все равно очистит (закроет) дескрипторы открытых файлов и освободит другие ресурсы, но буферы не будут очищены и т. д.

person Jonathan Leffler    schedule 10.09.2011

ОС убирает за вас. Это как ходить к друзьям - вежливо закрыть дверь в ванную и не позволять им делать это за тебя.

person Ed Heal    schedule 10.09.2011

Все дескрипторы, принадлежащие вашему процессу, будут очищены. Однако любые "именованные" объекты ядра, такие как именованные каналы и другие, останутся.

person Kenny Lim    schedule 10.09.2011