F_SETPIPE_SZ не объявлен

Я включил следующие заголовки:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

Я также пытался использовать

#define _GNU_SOURCE

до #include <unistd.h>, но и это не помогает.

Я пытаюсь использовать fcntl и передать его F_SETPIPE_SZ в качестве второго аргумента, но продолжаю получать это сообщение об ошибке:

ошибка: ‘F_SETPIPE_SZ’ необъявлено (первое использование в этой функции)

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

Спасибо.

Итак, вот решение, благодаря Chrono Kitsune: поставить

 #define _GNU_SOURCE

перед любым включением.


person Marko    schedule 20.08.2014    source источник
comment
Как вы звоните fcntl. Можете ли вы опубликовать это в своем вопросе?   -  person Fiddling Bits    schedule 20.08.2014
comment
Вы должны #define _GNU_SOURCE перед включением каких-либо заголовков. Сомневаюсь, что поможет, но сказать стоит. Что показывает uname -r? Если он меньше 2.6.35, у вас не должно быть F_SETPIPE_SZ. Страница руководства, которая у меня есть, документирует, что она доступна, начиная с Linux 2.6.35.   -  person    schedule 21.08.2014
comment
Спасибо, это действительно решило проблему, я не знаю, как, но это помогло. И еще одна проблема к. Потрясающий! Спасибо. (И нет, мое ядро ​​не такое старое :))   -  person Marko    schedule 21.08.2014
comment
@ChronoKitsune так не определяет. формальный способ включить это через cli: gcc --std=gnu blabla.   -  person Jason Hu    schedule 21.08.2014
comment
Вы не должны добавлять ответ на вопрос. Вместо этого опубликуйте его как ответ. Вам разрешено отвечать на свои вопросы, и вы должны будете принять их через день или два.   -  person Ross Ridge    schedule 21.08.2014
comment
@HuStmpHrrr Вы правы, но поскольку _GNU_SOURCE — это макрос тестирования функций Linux glibc (man feature_test_macros), так же как и _POSIX_C_SOURCE и _XOPEN_SOURCE, вполне разумно просто определить макрос для каждого файла до включения каких-либо заголовков. На странице руководства конкретно указано, что это разрешено. Важным моментом является определение его до того, как будут включены какие-либо заголовки, то есть либо в командной строке, либо в файле.   -  person    schedule 21.08.2014


Ответы (2)


Итак, вот решение, благодаря Хроно Кицунэ:

Помещать

#define _GNU_SOURCE

перед любым включением.

Вам также следует обратить внимание на другой комментарий от Chrono Kitsune.

person Marko    schedule 23.08.2014

F_SETPIPE_SZ/F_GETPIPE_SZ относительно недавно. В более старых ядрах (например, 2.6.32, используемом в RHEL6) их нет. Если вы посмотрите в /usr/include/linux/fcntl.h и эти константы не определены, то этот API не будет работать, и вам придется найти способ обойти его во всем, что вы создаете.

person user6017522    schedule 04.03.2016