Я пытаюсь реализовать файловую систему FUSE, и после прочтения. Я думаю, что я узнал, как это реализовать. Я бы сказал, что я думаю о реализации. Пожалуйста, дайте мне знать, если это правильно или неправильно.
Один реализует операции, которые должны быть реализованы файловой системой, используя любые функции, которые он сочтет нужными (скажем, xmp_getattributes
за getattr
функция), а затем сопоставляет эти функции с соответствующими функциями в структуре типа fuse_operations
static struct fuse_operations xmp_oper =
{
.getattr = xmp_getattributes,
//more declarations...
};
Теперь, если бы я использовал класс ExFuse
реализовать файловую систему FUSE, и у меня есть метод ExFuse::getAttributes
которая делает работу getattr
в реализации. Тогда моя декларация изменится как
static struct fuse_operations xmp_oper =
{
.getattr = ExFuse::getAttributes,
//more declarations...
};
Я прав? Кроме того, есть ли другой способ реализации FUSE в C ++, который лучше, чем static struct
декларация?
если бы я использовал класс
ExFuse
реализовать файловую систему FUSE, и у меня есть методExFuse::getAttributes
которая делает работуgetattr
в реализации. Тогда моя декларация изменится как
static struct fuse_operations xmp_oper =
{
.getattr = ExFuse::getAttributes,
//more declarations...
};
Это не верно. FUSE ожидает указатель на функцию, но ExFuse::getAttributes
является указателем на метод-член (поскольку вы явно не сказали, что это статический метод, я могу только предположить, что это метод-член). Они не одно и то же.
Вам нужно либо использовать простые функции, либо статические методы.
Есть ли другой способ реализации FUSE в C ++, который лучше, чем объявление статической структуры?
Боюсь, что нет. FUSE написан на C и ожидает, что вы будете придерживаться «C way». Это дает вам очень мало возможностей для использования парадигм C ++ в том, что касается общедоступного интерфейса (конечно, вы можете делать в значительной степени то, что вы хотите в частной реализации, пока вы не выбросите, но это не поможет вы пишете интерфейс для FUSE).
Также уже сказано выше, все методы вашего класса должны быть «статическими». Это потому, что когда у вас есть такой класс в C ++:
class example
{
example ()
int method (int i) {cout << i << '\n';}
};
int main (int argc, char **argv)
{
example ex;
ex.method (1);
}
Что действительно происходит, когда вы вызываете ex.method (1) выше, это вызов:
{NameMangling}method (&ex, 1);
Если «метод» не объявлен как статический, он обходит указатель «this» за кулисами. Все ваши прототипы будут неправильными для интерфейса FUSE.
Вы можете прекрасно использовать C ++ в FUSE, но нет смысла использовать классы для определения структур. Вы можете свободно пользоваться векторами, строками и т. Д., Но также учитывайте накладные расходы на использование C ++ (чего не произойдет, если вы делаете это правильно) — но если вы не знакомы с переводом C ++ -> C ( Раньше C ++ обычно был препроцессором C в старые добрые времена), старайтесь как можно больше придерживаться семантики C.