Доброго времени суток, уважаемые. Буду краток.$ uname -a
Linux lh-ABC512 2.6.35-29-generic #51-Ubuntu SMP Fri Apr 15 17:12:35 UTC 2011 x86_64 GNU/Linux
$ cat -n fifo.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <linux/stat.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include <errno.h>
10
11 #define FIFO_FILE "MYFIFO"
12
13 int main(void)
14 {
15 FILE *fp;
16 char readbuf[80];
17
18 umask(0);
19 mknod(FIFO_FILE, S_IFIFO|0666, 0);
20 while(1) {
21 fp = fopen(FIFO_FILE, "r");
22 fgets(readbuf, 80, fp);
23 printf("Received string: %s\n", readbuf);
24 fclose(fp);
25 }
26 return(0);
27 }
$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
$
$ gcc -std=c99 -Wall ./fifo.c -o ./fifo
./fifo.c: In function ‘main’:
./fifo.c:19: warning: implicit declaration of function ‘mknod’
./fifo.c:19: error: ‘S_IFIFO’ undeclared (first use in this function)
./fifo.c:19: error: (Each undeclared identifier is reported only once
./fifo.c:19: error: for each function it appears in.)
$
$ gcc -Wall ./fifo.c -o ./fifo
$
$ gcc-4.5 -v
Using built-in specs.
COLLECT_GCC=gcc-4.5
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.5.1/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.1-7ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.5.1 (Ubuntu/Linaro 4.5.1-7ubuntu2)
$
$ gcc-4.5 -std=c99 -Wall ./fifo.c -o ./fifo
./fifo.c: In function ‘main’:
./fifo.c:19:2: warning: implicit declaration of function ‘mknod’
./fifo.c:19:19: error: ‘S_IFIFO’ undeclared (first use in this function)
./fifo.c:19:19: note: each undeclared identifier is reported only once for each function it appears in
$
$ gcc-4.5 -Wall ./fifo.c -o ./fifo
$Все пути и хидеры корректны.
Вопрос: Почему с '-std=c99' такой результат?
Из-за XSI наверное.http://pubs.opengroup.org/onlinepubs/009695399/functions/mkn...
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/...
Если вопрос стоит ребром, то стоит парсить вывод gcc -E, разницу сгенерированных исходников.
> Если вопрос стоит ребром, то стоит парсить вывод gcc -E, разницу
> сгенерированных исходников.diff.txt (gcc-4.5 -std=c99 & gcc-4.5)
< mknod("MYFIFO", S_IFIFO|0666, 0);
---
> mknod("MYFIFO", 0010000|0666, 0);//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/usr/include/sys/stat.h#if defined __USE_BSD || defined __USE_MISC || defined __USE_XOPEN
# define S_IFMT __S_IFMT
# define S_IFDIR __S_IFDIR
# define S_IFCHR __S_IFCHR
# define S_IFBLK __S_IFBLK
# define S_IFREG __S_IFREG
# ifdef __S_IFIFO
# define S_IFIFO __S_IFIFO
# endif
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gcc-4.5 -Egcc-4.5:
# 323 "/usr/include/sys/stat.h" 3 4
extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev)
__attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
extern int mknodat (int __fd, __const char *__path, __mode_t __mode,
__dev_t __dev) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2)));# 444 "/usr/include/sys/stat.h" 3 4
extern int __xmknod (int __ver, __const char *__path, __mode_t __mode,
__dev_t *__dev) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 4)));
extern int __xmknodat (int __ver, int __fd, __const char *__path,
__mode_t __mode, __dev_t *__dev)
__attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 5)));gcc-4.5 -std=c99:
# 444 "/usr/include/sys/stat.h" 3 4
extern int __xmknod (int __ver, __const char *__path, __mode_t __mode,
__dev_t *__dev) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 4)));extern int __xmknodat (int __ver, int __fd, __const char *__path,
__mode_t __mode, __dev_t *__dev)
__attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 5)));
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/usr/include/sys/stat.h/* Create a device file named PATH, with permission and special bits MODE
and device number DEV (which can be constructed from major and minor
device numbers with the `makedev' macro above). */
#if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev)
__THROW __nonnull ((1));# ifdef __USE_ATFILE
/* Like mknod, create a new device file with permission bits MODE and
device number DEV. But interpret relative PATH names relative to
the directory associated with FD. */
extern int mknodat (int __fd, __const char *__path, __mode_t __mode,
__dev_t __dev) __THROW __nonnull ((2));
# endif
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/usr/include/features.c
/*
__USE_MISC Define things common to BSD and System V Unix.
__USE_BSD Define 4.3BSD things.
__USE_XOPEN_EXTENDED Define X/Open Unix things
*/
//...
#if defined _BSD_SOURCE || defined _SVID_SOURCE
# define __USE_MISC 1
#endif
/...
/*
_SVID_SOURCE ISO C, POSIX, and SVID things.
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$ cat -n def.c
1
2 #include <stdio.h>
3 #include <linux/stat.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 int main(void)
9 {
10
11 #if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED || \
12 defined _SVID_SOURCE || defined __USE_MISC || defined __USE_XOPEN
13 printf("Defined\n");
14 #endif
15 return 0;
16 }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$ gcc-4.5 -std=c99 -Wall ./def.c -o ./def
$ ./def
$
$ gcc-4.5 -Wall ./def.c -o ./def
$ ./def
Defined
$
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Есть предположения что gcc-4.5 -std=c99 _как-то_по_особенному_
сконфигурирован для данного дистрибутива либо я чего-то не понял.
> //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> Есть предположения что gcc-4.5 -std=c99 _как-то_по_особенному_
> сконфигурирован для данного дистрибутива либо я чего-то не понял.Результат препроцессинга различный, значит далее надо смотреть выводы gcc -M -dM: изучать разницу в наборе макросов и списка использованных заголовочных файлов. Находим, что в случае -std-c99 нет переопределения S_IFIFO в __S_IFIFO, находим, в каком из выданного списка использованных заголовочных файлов он был определён, и видим, что не хватает тройки макросов __бсд, __хопен, __миск. Смотрим разницу исходных наборов макросов через gcc -dM hello.c с пустым main() без заголовочных файлов, видим определение __STRICT_ANSI__, которое опять грепаем в том же списке использованных заголовочных файлов, находим feautures.h с подробными каментами. То есть, либо грубо неопределяем undef __STRICT_ANSI__ перед stdio.h, либо наоборот, определяем какой-либо из __бсд/__миск/__хопен перед включением stat.h.
Переопределить — не вопрос.
Вопрос — как это аукнется на остальных фрагментах кода.
Есть основания полагать, что ментейнер(ы) gcc в Ubuntu,
наверняка чем-то руководствовались, когда принимали решения о такой конфигурации gcc.
В итого: в мануале gcc-4.5 нашёл
gnu99
GNU dialect of ISO C99.
When ISO C99 is fully implemented in GCC, this will become the default.$ gcc-4.5 -std=gnu99 -Wall ./fifo.c -o ./fifo
$Попробую пересобрать весь проект с -std=gnu99.
Если появятся 'внезапности' — новый пост.Благодарю за подсказки.
> Переопределить — не вопрос.
> Вопрос — как это аукнется на остальных фрагментах кода.В принципе, ничто не мешает использовать __S_IFIFO, ничего не меняя в дефайнах.
> Есть основания полагать, что ментейнер(ы) gcc в Ubuntu,
> наверняка чем-то руководствовались, когда принимали решения о такой конфигурации gcc.На генте те же резултаты.
> В итого: в мануале gcc-4.5 нашёл
> gnu99
> GNU dialect of ISO C99.
> When ISO C99 is fully implemented in GCC, this will become the
> default.Он отличается от с99 как раз отсутствием __STRICT_ANSI__:
gcc hello.c -std=gnu99 -dM -M >std.gnu99gcc hello.c -std=c99 -dM -M >std.c99
diff std.gnu99 std.c99
46a47
> #define __STRICT_ANSI__ 169d69
< #define unix 1
86d85
< #define linux 1
112d110
< #define i386 1Мне интересны цели данной сборки. Розыгрыш коллег с триграфами '??/' ?
> В принципе, ничто не мешает использовать __S_IFIFO, ничего не меняя в дефайнах.«GCC unforeseen consequences complete walkthrough».
Захардкодить оно конечно можно.
Но на текущий момент времени, нет конкретной информации,
где НЕ будет собираться этот проект.> Он отличается от с99 как раз отсутствием __STRICT_ANSI__
alias gcc99='gcc-4.5 -std=gnu99 -pedantic-errors -Wall'.
> Розыгрыш коллег с триграфами '??/' ?
"Я бы этому дяде с большими ушами уши-то пооткрутил."(с)
>> Розыгрыш коллег с триграфами '??/' ?
> "Я бы этому дяде с большими ушами уши-то пооткрутил."(с)Да, триграфы были созданы для написания комментария
//Why the following line doesn't work??/мелкомягкий компилятор когда-то их поддерживал молча без предупреждений.
Не стоит лазить в /usr/include и делать какие-то выводы -- везде все по-разному. Лучше читайте стандарты, там все очень просто и доступно.
> Не стоит лазить в /usr/include и делать какие-то выводы -- везде все
> по-разному. Лучше читайте стандарты, там все очень просто и доступно.Да, очень просто, очень доступно, очень идеалистично, очень теоретично.
> Да, очень просто, очень доступно, очень идеалистично, очень теоретично.Вова, обычно мне кайфолом что-то пересказывать, и я даю ссылки. Пишу это только ради будущих поколений, что будут читать этот тред, дабы они не велись на твои бредовые загоны.
Стандарт, который в gcc зовется -std=c99, состоит из нескольких частей. Не каждая из этих частей обязана поддерживаться системой, чтобы отвечать этому стандарту. То, с чем вы тут столкнулись, называется XSI. Чтобы его задействовать, надо в самом начале исходника, т.е. перед инклудами, воткнуть #define _XOPEN_SOURCE 600, что просто, доступно, идеалистично и теоретично объяснено в последней ссылке.
Срочно читай IEEE Std 1003.1 много раз до просветления или меняй род занятий, кулхацкер.
>[оверквотинг удален]
> Вова, обычно мне кайфолом что-то пересказывать, и я даю ссылки. Пишу это
> только ради будущих поколений, что будут читать этот тред, дабы они
> не велись на твои бредовые загоны.
> Стандарт, который в gcc зовется -std=c99, состоит из нескольких частей. Не каждая
> из этих частей обязана поддерживаться системой, чтобы отвечать этому стандарту. То,
> с чем вы тут столкнулись, называется XSI. Чтобы его задействовать, надо
> в самом начале исходника, т.е. перед инклудами, воткнуть #define _XOPEN_SOURCE 600,
> что просто, доступно, идеалистично и теоретично объяснено в последней ссылке.
> Срочно читай IEEE Std 1003.1 много раз до просветления или меняй род
> занятий, кулхацкер.Ага, много пафосного текста, и только один момент: где по приведённым ссылкам упоминается стандарт 99?
>[оверквотинг удален]
> Вова, обычно мне кайфолом что-то пересказывать, и я даю ссылки. Пишу это
> только ради будущих поколений, что будут читать этот тред, дабы они
> не велись на твои бредовые загоны.
> Стандарт, который в gcc зовется -std=c99, состоит из нескольких частей. Не каждая
> из этих частей обязана поддерживаться системой, чтобы отвечать этому стандарту. То,
> с чем вы тут столкнулись, называется XSI. Чтобы его задействовать, надо
> в самом начале исходника, т.е. перед инклудами, воткнуть #define _XOPEN_SOURCE 600,
> что просто, доступно, идеалистично и теоретично объяснено в последней ссылке.
> Срочно читай IEEE Std 1003.1 много раз до просветления или меняй род
> занятий, кулхацкер.Скорее это ты тут обнаруживаешь незнание того, что такое XSI. Отвечаю развёрнуто.
mknod не может быть никаким 'XSI extension', как ты предполагал в первом сообщении. Это никакое не расширение апи X/Open System Interface. Мкнод - это и есть юникс, грубо говоря, сколько лет системе - столько и ему! SuS я читал не однократно, и продолжаю читать, и далеко не первый год, но с потребностью в данном макросе я сталкиваюсь впервые. Но отлично - я погуглил 10 минут, и теперь знаю больше тебя, и более того - знаю, как ты написал своё сообщение.
Где-то ты увидал этот дефайн, обнаружил что он помогает, но как - понять так и не смог. В man 2 mknod от glibc упомянут только лишь как один из вариантов _XOPEN_SOURCE >= 500.
Один из 4 макросов, которые дадут доступ к данному апи в glibc.
а 600 соответствует SuSv3. То есть бейс интерфейс 2001го (включая мкнод) + расширения.
Того же результата можно добиться с _BSD_SOURCE, с _SVID_SOURSE, с _XOPEN_SOURCE&& _XOPEN_SOURCE_EXTENDED, опять же - в конкретном случае реализации glibc. Никто не гарантирует работоспособность данных макросов при использовании других реализаций libc. Стандарт - это стандарт. Реализация - это реализация. Теория - практика. Мухи и котлеты.
ТС прости, но я хочу это сделать.> Скорее это ты тут обнаруживаешь незнание того, что такое XSI. Отвечаю развёрнуто.
> mknod не может быть никаким 'XSI extension', как ты предполагал в первом
> сообщении. Это никакое не расширение апи X/Open System Interface. Мкнод -
> это и есть юникс, грубо говоря, сколько лет системе - столько
> и ему!Молодец, ГТО. Только речь тут о -std=c99, с коим все слегка не так.
> SuS я читал не однократно, и продолжаю
> читать, и далеко не первый год, но с потребностью в данном
> макросе я сталкиваюсь впервые.Там общей информации чуток, остальная справочная. Чо ты там годами вычитываешь?? )))
Потребность в макросе всегда была (опять же при -std=c99).> Но отлично - я погуглил 10 минут,
> и теперь знаю больше тебя, и более того - знаю, как
> ты написал своё сообщение.Без комментариев...
> Где-то ты увидал этот дефайн, обнаружил что он помогает, но как
> - понять так и не смог.Этот дефайн, с помощью окружающих #if и #endif, разрешает в инклудах нужные объявления. Или будешь пугать меня магическими дефайнами?
> В man 2 mknod от
> glibc упомянут только лишь как один из вариантов _XOPEN_SOURCE >= 500.
> Один из 4 макросов, которые дадут доступ к данному апи в
> glibc.
> а 600 соответствует SuSv3. То есть бейс интерфейс 2001го (включая мкнод) +
> расширения.
> Того же результата можно добиться с _BSD_SOURCE, с _SVID_SOURSE, с
> _XOPEN_SOURCE&& _XOPEN_SOURCE_EXTENDED, опять же - в конкретном случае реализации glibc.Первые два--это способ объяснить glibc со товарищи, что эти сорцы писали, мм.. так сказать не совсем с оглядкой на переносимость, а с оглядкой на конкретную систему, прям как ты любишь. Хвала всем богам, различия часто несущественны или отсутствуют, что, например, позволяет компилить нативные бсдовые сорцы без изменений. При чем тут официально стандартизированные интерфейсы? Кстати C99 не включает mknod, угадай почему.
Если ты не заметил, ТС старается ориентироваться не на glibc, а на посикс. С таким подходом ему не придется лопатить сорцы при переходе на другую стандартную библиотеку; главное, чтобы она умела POSIX+XSI.
> Никто не гарантирует работоспособность данных макросов при использовании других реализаций
> libc.Ага, щас вот кто-нибудь как напииишет такую libc, что она не будет совместима ни с другой libc, ни с существующими сорцами, ни с POSIX, ни с SUS. Боюсь-боюсь.
> Стандарт - это стандарт. Реализация - это реализация. Теория -
> практика. Мухи и котлеты.Чушь и бред. Пруф в [1]. Там же описано, как mknod относится к C99, достаточно прочитать абзац со словами "File System Interface", перейти по ссылке, потом перейти на "Making Special Files".
Ты правда считаешь, что не стоит делать так, как написано в официальном документе, но вместо этого стоит копаться во внутренностях /usr/include, ища там ошибки, или использовать системные символы, начинающиеся с "__"? Можешь не утруждать себя ответом, мне не особо интересно.
[1] http://www.gnu.org/software/libc/manual/html_node/POSIX.html
>> Где-то ты увидал этот дефайн, обнаружил что он помогает, но как
>> - понять так и не смог.
> Этот дефайн, с помощью окружающих #if и #endif, разрешает в инклудах нужные
> объявления. Или будешь пугать меня магическими дефайнами?Этот дефайн ты где-то вычитал из сорцов, долго пялился в него, думая, случайно он помог, или "так и надо". Поэтому ты его закопировал посимвольно, с опаской: "наверное XSI", и только сейчас в тебе проснулось красноречие. Данные макросы формируют окружение, то есть фактически говорят, именно в данном случае из man 2 mknod: если не задан ни _BSD_SOURCE, ни _SVID_SOURCE и при этом твой любимый _XOPEN_SOURCE < 500 - то данная функция работать не будет. Про портабельность - за 10 лет я работал с двумя компиляторами, под десяток платформ, данный макрос - увы и ах, нет, не использовал, не припоминаю. Ни СанСтудио, ни любая инкарнация гцц его не требует - определяет самостоятельно.
Ладно, ладно, убил.. )) Ты прав, а я нет. Ты крут, а я лох, чмо и мудило.
Уж прости, что начал вякать не по теме )))) Давай закроем ее что-ли.2ТС: отдельно извиняюсь, проблема-то хоть решилась?
> 2ТС: отдельно извиняюсь, проблема-то хоть решилась?В итого: Да помогло.
Тему считаю закрытой.Всем спасибо, все свободны.(с)
По ссылкам tl;dr? Так и быть, держи еще одну.http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh...
> По ссылкам tl;dr?1. С таким подходом IT вообще не стоит заниматься.
2. Осиление информации по вашим ссылкам, благодарю за оные, запланированно на сегодняшний вечер.
> По ссылкам tl;dr? Так и быть, держи еще одну.
> http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh...оффтопик