2015-12-08 5 views
0

Ядра обеспечивают аппаратную абстракцию системными вызовами, такими как read() и write(). Многие из них довольно интуитивно понятны, но я действительно не понимаю, что такое open() и close().Что происходит, когда я открываю/закрываю файл?

Википедия говорит, что

open и close соответственно инициализации и прекратить доступ к файлу.

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

+0

Я бы предположил, что память распределяется/освобождается между прочим. –

+0

Учитывая, что ОС не знает, где на физическом жестком диске находится данный файл (который обрабатывается программным обеспечением управления приводом на самом диске или, как мне сказали, этот метод, вероятно, делает запрос на диск контроллер, чтобы найти файл, выделить память и, возможно, некоторые другие связанные с ОС задачи. Close будет делать обратное: освободите память и отпустите контроллер накопителя. Но я не знаю точно. – Draco18s

+0

Linux или Windows? Даже если есть много подобных вещей и понятий, обе ОС остаются довольно разными. – OznOg

ответ

0

В системах, подобных Unix, идея состоит в том, чтобы манипулировать ресурсами через файлы (в основном, записи в файловой системе и доступ с помощью read/write/open/close/ioctl для наиболее распространенных).

Таким образом, функции open() и close() можно рассматривать как способы приема/освобождения дескриптора определенного ресурса.

Во многих ситуациях вызовы open/close просто выполняют выделение ресурсов на уровне программного обеспечения (просто выделяют память или регистрируются в какой-либо среде или берут блокировку и т. Д.), Но, очевидно, что когда-то генерирует аппаратный доступ ,

Реализация, лежащая под вызовами open()/close(), всегда зависит от водителя, и программист может поместить в нее действительно конкретную вещь.

Вы можете найти так обзор этих реализаций в https://lwn.net/Kernel/LDD3/ или http://idak.gop.edu.tr/esmeray/UnderStandingKernel.pdf или даже читая исходники ядра http://lxr.free-electrons.com/source/drivers/input/mousedev.c?v=3.10#L530 (пример для устройства мыши)

Вы даже понять, что то, что вы считаете «интуитивно» является вообще-то нет. Даже простая функция read() может стать довольно сложной, если вы, например, выполняете IO на диске программного RAID.

+0

Замечательный. Благодаря! –

Смежные вопросы