Как проект колледжа я должен реализовать основную файловую систему из файла. Таким образом, как я иду об этом? Каковы вещи, которые я должен был бы знать? Требования включают наличие процесса демона в фоновом режиме. Также приложения, которые используют эту систему, должны соединиться с сервером с помощью сокета домена Unix
Файловая система должна иметь следующие возможности:
Проверьте это, если это может помочь. http://www.geocities.ws/ravikiran_uvs/articles/rkfs.html
Если вы хотите создать файловую систему в пользовательском пространстве, FUSE может вам помочь. http://fuse.sourceforge.net/
Можно ознакомиться с общей инфраструктурой ведения журнала . Это фасад вокруг рамок лесозаготовок, таких как log4net и LAB.
-121--4244673-Общий словарь реализован в виде хэш-таблицы, поэтому сложность алгоритма - O (1). Так что если перечисление довольно большое, это наиболее быстрый путь.
ОТРЕДАКТИРОВАНО: Чтобы прояснить... Предположим, что у вас есть несколько делегатов, которые объявляют правило преобразования, где ОДИН из них по умолчанию (SA- > DA), давайте назовем: default_delegate.
class MyMapper
{
delegate DestEnum singlemap(SourceEnum);
static Dictionary<SourceEnum, singlemap> _source2dest =
new Dictionary<SourceEnum, singlemap>();
static MyMapper()
{
//place there non-default conversion
_source2dest[S_xxxx] = My_delegate_to_cast_S_xxxx;
......
}
static singlemap MapDelegate(SourceEnum se)
{
singlemap retval;
//checking has complexity O(1)
if(_source2dest.TryGetValue ( se, out retval) )
return retval;
return default_delegate;
}
Поэтому при вызове MyMapper.MapDelegate возвращает любое время удаления для делать сопоставления.
-121--4407494-Файловая система по существу является базой данных для файлов. Главное, что вам нужно, это таблица поиска для хранения смещений байтов и длин файлов. Имена файлов также могут храниться в таблице или в первых нескольких байтах при каждом смещении. Вам будет намного проще сделать файловую систему фиксированным размером.
Это будет аналогично работе файловой системы FAT.
Вы также можете взглянуть на http://en.wikipedia.org/wiki/Database_storage_structures , поскольку на самых низких уровнях файловые системы и базы данных очень похожи.
Вот пример очень, очень простой реализации FUSE, которая поддерживается прославленным сегментом разделяемой памяти (xenstore). Это форк оригинальной файловой системы xenstore FUSE, которую я поддерживаю.
Вы также найдете код, показывающий, как сделать Valgrind более полезным при отладке реализаций FUSE.
Вы пишете функции для open / create / read / write / truncate / getattr / etc и передаете их в fuse (номера строк взяты из связанного примера):
343 static struct fuse_operations const xsfs_ops = {
344 .getattr = xsfs_getattr,
345 .mknod = xsfs_mknod,
346 .mkdir = xsfs_mkdir,
347 .unlink = xsfs_rm,
348 .rmdir = xsfs_rmdir,
349 .truncate = xsfs_truncate,
350 .open = xsfs_open,
351 .read = xsfs_read,
352 .write = xsfs_write,
353 .readdir = xsfs_readdir,
354 .create = xsfs_create,
355 .destroy = xsfs_destroy,
356 .utime = xsfs_utime,
357 .symlink = xsfs_symlink,
358 .init = (void *)xsfs_init
359 };
Как видите, это очень понятно. Небольшой поиск также приведет к обнаружению многих базовых примеров реализации FUSE с файловой поддержкой.
Я настоятельно рекомендую делать это полностью в пространстве пользователя, если у вас нет достаточно времени, чтобы достаточно хорошо познакомиться с ядром.
Самым простым способом сделать это было бы построить шаблон для хранения данных, и разобрать файлы в таран, конечно, это не самый эффективный способ.
Что-то вроде...
SOME/LOCATION/Filename >>> содержимое файла здесь, бла-бла-бла. <<< ЗАПИСЬ/ОТДЕЛЬ/МЕСТНОЕ РАЗМЕЩЕНИЕ/Имя файла >>>> содержимое другого файла здесь <<<
Затем, чтобы перечислить каталог, с помощью regex найдите все строки, заканчивающиеся на >>>, затем разберите до X-ой косой черты (исходя из количества косых черт в искомой папке), и выполните поиск с учетом регистра (в), исходя из того, хотите ли вы, чтобы он был чувствителен к регистру или нет. Конечно, как я уже говорил, загружая его в память, вы можете искать хэш-маску ключа>значения, что, вероятно, было бы намного проще.