В соответствии с/usr/include каталогом в Linux я ввел команду: найдите - тип f - называет unistd.h, который дал следующий вывод:
./unistd.h./linux/unistd.h./asm-generic/unistd.h./bits/unistd.h./asm/unistd.h./sys/unistd.h
мой вопрос, какова цель каждого unistd.h, так как существует только одно определение того файла в единственной спецификации Unix?
Заранее спасибо.
linux / unistd.h
, на самом деле указывает на asm / unistd.h
, который, в свою очередь, указывает либо на asm / unistd_32.h
, либо на asm / unistd_64.h
, где номера системных вызовов определяются и представляются в пространстве пользователя в зависимости от системы архитектура. Они исходят из ядра.
bits / unistd.h
- это набор макросов, дополняющих unistd.h
(в основном для предотвращения переполнения буфера), который условно включен через:
/* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/unistd.h>
#endif
По сути, только требуемый заголовок POSIX - это на самом деле просто unistd.h
, остальные являются либо расширениями, либо определениями из ядра. Итак, просто включение unistd.h
- это все, о чем вам нужно беспокоиться, все, что вам нужно, будет втянут в зависимости от вашей архитектуры и любых выбранных вами параметров сборки.
Это обычная техника в C и C++ - у вас есть один файл со "стандартным" именем в "стандартном" месте, в данном случае ./unistd.h, а затем этот файл включает один или несколько специфических файлов реализации, в зависимости от макросов препроцессора. Если вы посмотрите почти на любой "стандартный" заголовочный файл C или C++, вы увидите, что он включает другие файлы, не упомянутые ни в одном стандарте.
В принципе, думайте о /usr/include/unistd.h
как об умной символической ссылке. Она будет указывать на правильную реализацию в зависимости от условий работы.
При этом иногда трудно понять, что это за правильная реализация.