Получение ошибки GCC: «sys / memfd.h: нет такого файла или каталога» - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь использовать системный вызов memfd_create в моем C-коде.Я попытался включить sys / memfd.h, так как страница руководства для memfd_create говорит, что это уместно, но GCC выдает мне ошибку «sys / memfd: Нет такого файла или каталога».

Я пробовал поискать в Google ине могу найти никого, имеющего ту же проблему.Я заметил, что некоторые версии man-страницы для memfd_create говорят, что я должен включить sys.mman.h, но, похоже, это не помогло, когда я попробовал.Было бы сказано, что memfd_create был неявно объявлен.

Вот минимальное воспроизведение моей проблемы.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

#include <sys/mman.h>

#include <sys/memfd.h>



int main(){

        int fd;
        fd = memfd_create("test", MFD_CLOEXEC);

        return 0;
}

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

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

В старых системах вам нужно будет включить linux/memfd.h для определения MFD_ и вызвать memfd_create() через оболочку syscall(2) (и включить unistd.h и sys/syscall.h для его работы).

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/memfd.h>
#include <err.h>
int main(void){
        int fd;
        if((fd = syscall(SYS_memfd_create, "test", MFD_CLOEXEC)) == -1)
                err(1, "memfd_create");
        return 0;
}
0 голосов
/ 16 июня 2019

Если у вас установлены справочные страницы Linux, введите:

man memfd_create

, чтобы вызвать страницу справки для memfd_create() и там будет написано:

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <sys/mman.h>

Так что вам нужно толькочтобы включить <sys/mman.h>, и вам нужно собрать с -D_GNU_SOURCE во флаги вашего компилятора.Или сделайте, как говорится на странице руководства, буквально #define _GNU_SOURCE, прежде чем включать заголовок.Однако я рекомендую вместо этого просто скомпилировать с помощью -D_GNU_SOURCE.

Если у вас не установлены справочные страницы, вы можете найти их в Интернете здесь:

http://man7.org/linux/man-pages/dir_all_alphabetic.html

...