Как использовать функцию getattr в моей реализации программы C Fuse - linux - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь написать простую программу FUSE (Filer USErspace) для реализации команды getattr, которая используется для возврата атрибутов файла. Библиотеки fuse.h хорошо настроены. Я использовал команду: "$ gcc main.c -o main" для компиляции моего кода. Тем не менее, я получил следующую ошибку при запуске моего кода. Я пытаюсь понять, что передаваемый тип указателя несовместим. Также следует отметить, что я запускаю эту программу с использованием эмулятора онлайн-терминала, веб-сайт https://repl.it/.

main. c: 45: 16: warning: инициализация из несовместимого типа указателя [-Wincompatible-pointer-types] .getattr = do_getattr, ^ ~~~~~~~~~ main. c: 45: 16: note: (рядом с инициализацией для операций. /tmp/ccPYbupQ.o: В функции `main ': main. c :(. text + 0xff): неопределенная ссылка на` fuse_main_real'collect2: ошибка: ld вернул 1 состояние выхода

Может кто-то помочь, я еще не профессионал. Что может означать эта ошибка и как ее можно решить? Спасибо

Вот мой код:


#include "fuse.h"
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
static int do_getattr( const char *path, struct stat *st )
{
    printf( "[getattr] Called\n" );
    printf( "\tAttributes of %s requested\n", path );

    st->st_uid = getuid(); // The owner of the file/directory is the user who mounted the filesystem
    st->st_gid = getgid(); // The group of the file/directory is the same as the group of the user who mounted the filesystem
    st->st_atime = time( NULL ); // The last "a"ccess of the file/directory is right now
    st->st_mtime = time( NULL ); // The last "m"odification of the file/directory is right now

    if ( strcmp( path, "/" ) == 0 )
    {
        st->st_mode = S_IFDIR | 0755;
        st->st_nlink = 2; 
    }
    else
    {
        st->st_mode = S_IFREG | 0644;
        st->st_nlink = 1;
        //st->st_size = 1024;
    }

    return 0;
}
static struct fuse_operations operations = {
    .getattr    = do_getattr,
};

int main( int argc, char *argv[] )
{
    return fuse_main( argc, argv, &operations, NULL );
}```

...