亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

使用libfuse進行開發

2024-01-31 01:13:09
116
0

1. 環境搭建

安裝以下庫:

sudo apt install libfuse-dev
sudo apt-get install fuse3

2.編譯測試驗證

在libfuse的代碼下有關于fuse的實現demo,以高level的api hello為例子:

//系統回調函數
static struct fuse_operations hello_oper = {
	.init           = hello_init,
	.getattr	= hello_getattr,
	.readdir	= hello_readdir,
	.open		= hello_open,
	.read		= hello_read,
};
// fuse的入口
return fuse_main(args.argc, args.argv, &hello_oper, NULL);

編譯:

gcc -Wall hello.c `pkg-config fuse3 --cflags --libs` -o hello

運行:

./hello /home/test/hello

通過 ls 命令查看 /home/test/hello下的文件, 可以看到有個hello的文件, cat 查看該文內容:

$ ls /home/test/hello/
hello
$ cat /home/test/hello/hello
Hello World!

代碼的實現原理如下: 使用ls查看會回調到fuse的hello_readdir函數中,filler函數添加顯示的內容,而 使用cat命令則回調到hello_read函數中.

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
			 off_t offset, struct fuse_file_info *fi,
			 enum fuse_readdir_flags flags)
{
	....

	filler(buf, ".",  NULL, 0, 0);
	filler(buf, "..",  NULL, 0, 0);
	filler(buf, options.filename, NULL, 0, 0);

	return 0;
}

static int hello_read(const char *path, char *buf, size_t size, off_t offset,
		      struct fuse_file_info *fi)
{
    ....
	len = strlen(options.contents);
	if (offset < len) {
		if (offset + size > len)
			size = len - offset;
		memcpy(buf, options.contents + offset, size);
	} else
		size = 0;

	return size;
}

測試其他命令例如mkdir, 此時命令行報錯,說明未實現mkdir相關的函數操作.

cd /home/test/hello && mkdir test
mkdir: 無法創建目錄 “test”: 函數未實現

passthrough.c中實現的回調比較全,可以參考進行進行擴展:

static struct fuse_operations xmp_oper = {
	.init           = xmp_init,
	.getattr	= xmp_getattr,
	.access		= xmp_access,
	.readlink	= xmp_readlink,
	.readdir	= xmp_readdir,
	.mknod		= xmp_mknod,
	.mkdir		= xmp_mkdir,
	.symlink	= xmp_symlink,
	.unlink		= xmp_unlink,
	.rmdir		= xmp_rmdir,
	.rename		= xmp_rename,
	.link		= xmp_link,
	.chmod		= xmp_chmod,
	.chown		= xmp_chown,
	.truncate	= xmp_truncate,
#ifdef HAVE_UTIMENSAT
	.utimens	= xmp_utimens,
#endif
	.open		= xmp_open,
	.read		= xmp_read,
	.write		= xmp_write,
	.statfs		= xmp_statfs,
	.release	= xmp_release,
	.fsync		= xmp_fsync,
#ifdef HAVE_POSIX_FALLOCATE
	.fallocate	= xmp_fallocate,
#endif
#ifdef HAVE_SETXATTR
	.setxattr	= xmp_setxattr,
	.getxattr	= xmp_getxattr,
	.listxattr	= xmp_listxattr,
	.removexattr	= xmp_removexattr,
#endif
};
0條評論
作者已關閉評論
張****龍
18文章數
0粉絲數
張****龍
18 文章 | 0 粉絲
張****龍
18文章數
0粉絲數
張****龍
18 文章 | 0 粉絲
原創

使用libfuse進行開發

2024-01-31 01:13:09
116
0

1. 環境搭建

安裝以下庫:

sudo apt install libfuse-dev
sudo apt-get install fuse3

2.編譯測試驗證

在libfuse的代碼下有關于fuse的實現demo,以高level的api hello為例子:

//系統回調函數
static struct fuse_operations hello_oper = {
	.init           = hello_init,
	.getattr	= hello_getattr,
	.readdir	= hello_readdir,
	.open		= hello_open,
	.read		= hello_read,
};
// fuse的入口
return fuse_main(args.argc, args.argv, &hello_oper, NULL);

編譯:

gcc -Wall hello.c `pkg-config fuse3 --cflags --libs` -o hello

運行:

./hello /home/test/hello

通過 ls 命令查看 /home/test/hello下的文件, 可以看到有個hello的文件, cat 查看該文內容:

$ ls /home/test/hello/
hello
$ cat /home/test/hello/hello
Hello World!

代碼的實現原理如下: 使用ls查看會回調到fuse的hello_readdir函數中,filler函數添加顯示的內容,而 使用cat命令則回調到hello_read函數中.

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
			 off_t offset, struct fuse_file_info *fi,
			 enum fuse_readdir_flags flags)
{
	....

	filler(buf, ".",  NULL, 0, 0);
	filler(buf, "..",  NULL, 0, 0);
	filler(buf, options.filename, NULL, 0, 0);

	return 0;
}

static int hello_read(const char *path, char *buf, size_t size, off_t offset,
		      struct fuse_file_info *fi)
{
    ....
	len = strlen(options.contents);
	if (offset < len) {
		if (offset + size > len)
			size = len - offset;
		memcpy(buf, options.contents + offset, size);
	} else
		size = 0;

	return size;
}

測試其他命令例如mkdir, 此時命令行報錯,說明未實現mkdir相關的函數操作.

cd /home/test/hello && mkdir test
mkdir: 無法創建目錄 “test”: 函數未實現

passthrough.c中實現的回調比較全,可以參考進行進行擴展:

static struct fuse_operations xmp_oper = {
	.init           = xmp_init,
	.getattr	= xmp_getattr,
	.access		= xmp_access,
	.readlink	= xmp_readlink,
	.readdir	= xmp_readdir,
	.mknod		= xmp_mknod,
	.mkdir		= xmp_mkdir,
	.symlink	= xmp_symlink,
	.unlink		= xmp_unlink,
	.rmdir		= xmp_rmdir,
	.rename		= xmp_rename,
	.link		= xmp_link,
	.chmod		= xmp_chmod,
	.chown		= xmp_chown,
	.truncate	= xmp_truncate,
#ifdef HAVE_UTIMENSAT
	.utimens	= xmp_utimens,
#endif
	.open		= xmp_open,
	.read		= xmp_read,
	.write		= xmp_write,
	.statfs		= xmp_statfs,
	.release	= xmp_release,
	.fsync		= xmp_fsync,
#ifdef HAVE_POSIX_FALLOCATE
	.fallocate	= xmp_fallocate,
#endif
#ifdef HAVE_SETXATTR
	.setxattr	= xmp_setxattr,
	.getxattr	= xmp_getxattr,
	.listxattr	= xmp_listxattr,
	.removexattr	= xmp_removexattr,
#endif
};
文章來自個人專欄
文章 | 訂閱
0條評論
作者已關閉評論
作者已關閉評論
0
0