Если бы код, сгенерированный реализацией C, был единственным, что собирался работать на целевой системе (как это было бы для многих автономных реализаций и для очень небольшого числа размещенных реализаций) и если реализация знала точно на каком оборудовании он будет работать (правда, для некоторых автономных реализаций, но редко для хостовых), его библиотека времени выполнения могла бы выполнять такие операции, как «fopen», напрямую взаимодействуя с оборудованием хранилища.Однако редко применяется какое-либо условие, а тем более и то и другое.
Если запоминающее устройство будет использовать несколько программ, обычно необходимо, чтобы они либо каким-либо образом координировали свои действия, либо последовательностиоперации, выполняемые различными программами, не перекрываются, и каждая программа «забывает» все, что, по ее мнению, она знает о состоянии хранилища, каждый раз, когда другая программа могла бы записать в нее.
В противном случае, предположим, что диск содержит одинФайл и программа # 1 используют «fopen», чтобы открыть его для чтения.Каждый сектор каталогов содержит 8 записей, поэтому программа считывает первый сектор каталогов и отмечает, что слот № 0 идентифицирует интересующий файл, в то время как № 1- № 7 пусты.
Теперь предположим, что программа №2 использует «fopen» для создания файла для записи.Он считывает сектор каталогов, наблюдает, что слоты № 1- № 7 пусты, и переписывает сектор каталогов с информацией о новом файле в слоте № 1.
Наконец, предположим, что программа # 1 хочет записатьфайл.Если он не знает о программе # 2, он может разумно полагать, что знает, что содержит каталог (он прочитал его ранее, и у него нет оснований полагать, что он изменился), поместить информацию о новом файле в слот # 1 изамените сектор каталога на диске новой версией, уничтожив запись, написанную программой №2.
Обе программы направляют свои операции через операционную систему, гарантируя, что когда программа №2 захочет создать свой файл, она сможетиспользовать тот факт, что он только что прочитал каталог для программы # 1 (и, следовательно, не нужно перечитывать его).Что еще более важно, когда программа # 1 отправляется на запись файла, операционная система будет знать, что каталог содержит файл, написанный программой # 2, и, таким образом, будет гарантировать, что новый файл будет помещен в слот № 2.
Вопреки тому, что говорят другие ответы, даже реализации микрокомпьютера C, работающие на платформах, таких как MS-DOS, по существу всегда полагались на ОС для файлового ввода-вывода.Некоторые включали бы свои собственные подпрограммы консольного ввода-вывода, потому что те в MS-DOS были примерно в четыре раза медленнее, чем они должны были быть, но необходимость координации при использовании файлового ввода-вывода означала, что очень немногие программы попытались бы сделать этосами по себе.