对于一项任务,我们必须使用C构建一个FUSE文件系统。我正在尝试在我启动保险丝时挂载的mountpoint目录中创建一个空文件,但它无效。
我尝试将以下内容放在我自己的fuse init函数实现中:
FILE * fp = fopen("data.0", "w");
fclose(fp);
在我完成之后,当我尝试导航到挂载点时发生的事情是我收到错误:Transport endpoint is not connected
。
当我尝试使用-d
标志在调试模式下运行FUSE时,终端和FUSE冻结,然后我甚至无法导航到包含挂载点的目录。
然后我把以下内容放在我的read:
的实现中mknod("data.0", 33206, 20); // a mode of 33206 means that it's a regular file with permissions 666
然后当我查看调用mknod()
的结果时,我得到-1
(错误)的返回值和errno
的{{1}}(操作不允许) )。
如果我再次调用我的读取函数(通过打开文件),现在我仍然得到1
(错误)的返回值,但是-1
的{{1}}(权限被拒绝) )。请注意,目录中只有一个文件,并且它只存在,因为我的errno
函数用该文件的名称填充缓冲区。目录中没有物理文件。
我可能接近这一切都错了。 如何创建空文件?
FUSE只是内存中的东西吗?
好吧也许问这个可能更好: 如果我想创建一个FUSE文件系统,它所做的就是在mountpoint中创建一个物理空文件并让你访问该文件,我该怎么做?
答案 0 :(得分:0)
事实证明,当FUSE启动时,它从根目录开始,“/”不是您指定的挂载点。所以通过运行诸如init
内部的内容:
FILE* fp = fopen("data.0", "w+");
fclose(fp);
FUSE崩溃了,因为该命令是作为没有权限写入根目录(“/”)的登录用户运行的。
通过尝试在“/”中创建文件夹,授予每个人完全权限,然后写入该文件夹,解决了这个问题:
sudo -s
cd /
mkdir data
chmod 777 data
然后在保险箱init
:
FILE* fp = fopen("/data/data.0", "w+");
fclose(fp);