fuse: ошибка при создании потока: ресурс временно недоступен

#c #fuse

#c #fuse

Вопрос:

После написания функций getattr и readdir для простейшей файловой системы fuse я получаю fuse: ошибка при создании потока: ресурс временно недоступен.. Я хотел бы знать, где в моем коде я допустил ошибку

Я уже искал это, но не смог найти ничего, что меня удовлетворяет. Мне кажется, что он превысил лимит потока, но я не знаю, как это исправить. Я скомпилировал его с

 $ gcc passthrough.c -o passthrough `pkg-config fuse --cflags --libs`
passthrough.c:65:2: warning: initialization from incompatible pointer type [enabled by default]
  .getattr = e_getattr,
  ^
passthrough.c:65:2: warning: (near initialization for 'oper.getattr') [enabled by default]
  

Вот исходный код программы

 #define FUSE_USE_VERSION 26

#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <sys/time.h>
#include <limits.h>

char rootdir[100];

void get_fullpath(char fpath[PATH_MAX], const char *path){
    strcpy(fpath,rootdir);
    strncat(fpath,path,PATH_MAX);
    printf("[fullpath] file: %sn",fpath);
}

int e_getattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi){
    (void)fi;
    int res;

    char fpath[PATH_MAX];
    get_fullpath(fpath,path);

    printf("[getattr] file: %sn",fpath);

    res = lstat(fpath,stbuf);
    if (res == -1)
        return -errno;
    return 0;
}

int e_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi){
    DIR *dp;
    struct dirent *de;

    (void)offset;
    (void)fi;

    char fpath[PATH_MAX];
    get_fullpath(fpath,path);
    printf("[readdir] file: %sn",fpath);

    dp = opendir(fpath);
    if (dp == NULL)
        return -errno;

    while ((de = readdir(dp)) != NULL){
        struct stat st;
        memset(amp;st,0,sizeof(st));
        st.st_ino = de->d_ino;
        st.st_mode = de->d_type << 12;
        if (filler(buf,de->d_name,amp;st,0))
            break;
    }
    closedir(dp);
    return 0;
}

struct fuse_operations oper = {
    .getattr = e_getattr,
    .readdir = e_readdir,
};

int main(int argc, char * argv[]){
    umask(0);
    realpath(argv[2],rootdir);
    printf("Real path is %sn",rootdir);
    return fuse_main(argc,argv,amp;oper,NULL);
}
  

И вот результат, который я получаю

 [fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
[fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
[fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
[fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
[fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
[fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
...
...
...
[fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
fuse: error creating thread: Resource temporarily unavailable
[fullpath] file: /home/echo/passthrough/test/
[getattr] file: /home/echo/passthrough/test/
  

Комментарии:

1. Интересно, почему passthrough.c:65:2: warning: initialization from incompatible pointer type [enabled by default] .getattr = e_getattr, это происходит… хотя, кажется, соответствует int(* getattr )(const char *, struct stat *, struct fuse_file_info *fi)

2. Это также одна из вещей, которая меня смущает, я перешел на passhrough.c из libfuse github

3. предлагаю прочитать: как использовать fuse

4. OT: относительно: realpath(argv[2],rootdir); Никогда не заходите дальше argv[0] без предварительной проверки argc , чтобы убедиться, что ожидаемые параметры командной строки действительно были введены. Если они не были введены пользователем, затем выведите в stderr , сообщение ОБ ИСПОЛЬЗОВАНИИ, похожее на: fprintf( stderr, "USAGE: %s <descriptiion of each parameter>n", argv[0] ); followed by: exit( EXIT_FAILURE ); ` Кроме того, что ожидается для argv[1] ? Он никогда не используется в опубликованном коде

5. что касается: strncat(fpath,path,PATH_MAX); Не должен использовать: PATH_MAX потому что часть массива fpath уже содержит данные из path . итак, третий параметр должен быть похож на: PATH_MAX - (strlen( path ) 1)

Ответ №1:

проблема в функции: e_getattr() Это должно быть записано как:

 static int e_getattr(const char *path, struct stat *stbuf )
{
    int res;

    char fpath[PATH_MAX];
    get_fullpath(fpath,path);

    printf("[getattr] file: %sn",fpath);

    res = lstat(fpath,stbuf);
    if (res == -1)
        return -ENONET;
    return 0;
}
  

Обратите внимание на добавленный модификатор static

Обратите внимание на удаление третьего параметра функции

Обратите внимание на изменение возврата (при ошибке) к -ENONET

Также в списке включенных заголовочных файлов отсутствует инструкция;

 #include <stdlib.h> // exposes function: `realpath()`
  

функции: e_getattr() также необходим `статический модификатор

Комментарии:

1. это устранило предупреждения во время компиляции, однако результат выполнения все тот же, что и в ответе

2. вы имеете в виду: «как в вопросе»?

3. вопрос касался предупреждений компилятора и невозможности запустить другой поток. Этот ответ касается предупреждений компилятора, поскольку их необходимо исправить в первую очередь