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
- это все, о чем вам нужно беспокоиться, все, что вам нужно, будет задействовано в зависимости от вашей архитектуры и выбранных вами вариантов сборки.