Что произойдет, если вы выйдете из программы, не выполнив функцию 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.

3 9

3 ответа:

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

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

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

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