Низкоуровневые дисковые операции в Linux для C++

какие методы существуют в linux для низкоуровневых дисковых операций на C++? Я пытаюсь написать свой собственный менеджер данных на диске. Например, я хотел бы создать программу на C++ в среде Linux, которая выделила определенное количество (непрерывное) на диске, а затем свободно позволяет мне читать/писать на этот кусок данных. Я не думаю, что хочу использовать стандарт fstream::open потому что тогда файл управляется ОС, и я не могу получить непрерывный раздел на диск.

спасибо.

3 ответов


как правило," низкоуровневые " дисковые операции из пользовательских программ1 в Linux включают открытие диска специального устройства. На моем компьютере они называются именами, такими как" /dev/sda "или" /dev/sda4 "или даже"/dev/disk/by-uuid/2a5150b4-71cb-11e1-b2fe-3b0d270b4e16".

вы должны проявлять большую осторожность при выборе файла устройства. Запись в системный раздел с помощью этого не является хорошей идеей. Кроме того, открытие файла устройства требует корневого доступа в большинстве случаев (по понятным причинам).

вопрос о том, чтобы использовать fstream ортогональна. Вы можете использовать std::fstream, fopen или даже open открыть устройство. Затем используйте любую операцию чтения, соответствующую открытию, которое вы сделали.

для вашего конкретного примера, вы могли бы пересмотреть, нужна ли вам эта функциональность. Цитата Википедия, который в свою очередь цитировал Руководство Системного Администратора Linux:

однако, как система Linux Руководство администратора гласит: "современная файловая система(ы) Linux сохраняет фрагментацию как минимум, сохраняя все блоки в файле близко друг к другу, даже если они не могут быть сохранены в последовательных секторах. Некоторые файловые системы, такие как ext3, эффективно выделяют свободный блок, ближайший к другим блокам в файле. Поэтому не стоит беспокоиться о фрагментации в системе Linux."


1 поскольку вы упомянули C++, я предполагаю, что вы пишете пользователя программа, а не драйвер устройства. По-настоящему" низкоуровневые " дисковые операции доступны только внутри ядра. Если вы, на самом деле, хотите написать драйвер устройства, пожалуйста, повторите свой вопрос, чтобы сделать это ясно.


Я не знаю, как это сделать, используя стандартные файловые системы Linux. Я думаю, вам придется иметь отдельный раздел и делать ввод-вывод непосредственно на его dev псевдо-файл (например,/dev/sda2).


вы должны использовать системные вызовы. Вот список:системные вызовы linux