Какие методы существуют в Linux для низкоуровневых операций на диске в C ++? Я пытаюсь записать свой собственный менеджер данных на диск. Например, я хотел бы создать программу на C ++ в среде Linux, которая бы выделяла определенное количество (непрерывно) на диске, а затем свободно позволяла мне читать / записывать в этот кусок данных. Я не думаю, что я хочу использовать стандарт fstream::open
потому что тогда файл управляется ОС, и я не могу получить непрерывный раздел на диске.
Благодарю.
Как правило, «низкоуровневые» дисковые операции от пользовательских программ1 В Linux предполагают открытие диска специальным устройством. На моем компьютере это имена, такие как «/ dev / sda» или «/ dev / sda4» или даже «/ dev / disk / by-uuid / 2a5150b4-71cb-11e1-b2fe-3b0d270b4e16».
Вы должны быть очень внимательны при выборе файла вашего устройства. Запись в системный раздел с помощью этого не очень хорошая идея. Кроме того, для открытия файла устройства в большинстве случаев требуется root-доступ (по понятным причинам).
Вопрос о том, использовать ли fstream
является ортогональным. Вы можете использовать std::fstream
, fopen
или даже open
открыть устройство. Затем используйте любую операцию чтения, соответствующую открытому вами.
Для вашего конкретного примера вы можете пересмотреть, нужна ли вам эта функциональность. квотирование Википедия, который в свою очередь цитирует Руководство системного администратора Linux:
Однако, как говорится в Руководстве системного администратора Linux, «современные файловые системы Linux поддерживают минимальную фрагментацию, сохраняя все блоки в файле близко друг к другу, даже если они не могут быть сохранены в последовательных секторах. Некоторые файловые системы, такие как ext3, эффективно выделить свободный блок, ближайший к другим блокам в файле. Поэтому нет необходимости беспокоиться о фрагментации в системе Linux. «
1 Поскольку вы упоминаете C ++, я предполагаю, что вы пишете пользовательскую программу, а не драйвер устройства. Действительно «низкоуровневые» дисковые операции доступны только внутри ядра. Если вы действительно хотите написать драйвер устройства, пожалуйста, переформулируйте ваш вопрос, чтобы прояснить это.
Я не знаю ни одного способа сделать это, используя стандартные файловые системы Linux. Я думаю, что вам придется иметь отдельный раздел и делать ввод / вывод непосредственно на его dev
псевдофайл (например, /dev/sda2
).
Вы должны использовать системные вызовы. Здесь есть список: системные вызовы linux