Разъяснение по внедрению файловой системы FUSE при переполнении стека

Я пытаюсь реализовать файловую систему 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 декларация?

2

Решение

если бы я использовал класс 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).

3

Другие решения

Также уже сказано выше, все методы вашего класса должны быть «статическими». Это потому, что когда у вас есть такой класс в 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.

0

По вопросам рекламы [email protected]