作为一个大学项目,我需要从一个文件中实现一个基本的文件系统。 那么我怎么去做呢? 我需要知道哪些事情? 要求包括在后台进行守护进程。 此外,使用这个系统的应用程序需要使用Unix域套接字连接到服务器
文件系统应该具有以下function:
检查一下,如果它可以帮助。 http://www.geocities.ws/ravikiran_uvs/articles/rkfs.html
如果你想在用户空间创建一个文件系统,FUSE可以帮助你。 http://fuse.sourceforge.net/
这里是一个非常非常基本的FUSE实现的例子 ,它由一个荣耀的共享内存段(xenstore)支持。 它是我维护的原始的xenstore FUSE文件系统的一个分支。
您还将找到一些代码来向您展示如何在调试FUSE实现时使Valgrind更有帮助。
你写函数打开/创建/读/写/ truncate / getattr /等,并传递给他们保险丝(行号来自链接的例子):
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实现的基本文件支持的例子。
我强烈建议完全在用户空间中完成,除非您有足够的时间熟悉内核。
文件系统基本上是文件的数据库。 你需要的主要是查找表来存储字节偏移量和文件长度。 文件名也可以存储在表中,或者可以存储在每个偏移量的前几个字节中。 如果您将文件系统设置为固定大小,则将会更容易。
这将与FAT文件系统的工作方式类似。
你也可以看看http://en.wikipedia.org/wiki/Database_storage_structures,因为在最底层的文件系统和数据库是非常相似的。
最简单的方法是建立一个模板来存储数据,然后把文件解析成ram,当然这不是最有效率的。
就像是…
一些/位置/文件名>>>这里的文件的内容,等等等等<<< SOME / OTHER / LOCATION / File2Name >>>这里的另一个文件的内容<<<
然后列出一个目录,使用正则表达式查找以>>>结尾的所有行,然后解析到第X个斜杠(根据搜索文件夹中斜杠的数量),并进行一个大小写敏感的搜索,基于不管你是否希望这是区分大小写的。 当然,正如我提到的将它加载到内存中,你可以搜索一个key-> value的hashmap,这可能会简单得多。