(Это не совсем ответ, больше комментариев)
Вы должны быть немного осторожны в A && B || C
Сочетания:
Возвращает A A
Возвращает успех, то B
выполнен
B
впоследствии возвращает состояние выхода, затем C
тоже будет выполнен. $ [[ -f /etc/passwd ]] && { echo "file exists"; false; } || echo "file does not exist"
file exists
file does not exist
Если A; тогда б; остальное c; ФИ
в этом отношении безопаснее, в этом C
не зависит от B
, только A
$ if [[ -f /etc/passwd ]];then { echo "file exists"; false; }; else echo "file does not exist"; fi
file exists
$ echo $?
1
Вы не можете #include
два заголовка с одинаковым путем, но вы можете установить один вне обычных путей и заменить его при компиляции с помощью соответствующий переключатель (для gcc, -I
). Я думаю, вы уже это понимаете, поэтому не нужно слишком много думать, чтобы осознать это, если вы поместите более одного asm / fcntl.h
в обычные подключаемые каталоги, только один из них будет применить в любом случае .
Однако я не думаю, что вам есть о чем беспокоиться. Начнем с некоторых ваших комментариев:
Те функции в программе пользовательского пространства, которые используют новые механизмы ядра, могут быть отключены.
Это хорошо. Если вам нужно #define NEWVALUE 666
для компиляции , и это включает в себя функцию, которая будет работать только с более новым ядром, и вы можете поймать или отключить ее использование в противном случае, тогда секции, которые действительно применяют NEWVALUE
, никогда не будут вызваны. Помните, это не значит, что нет заголовка, определяющего это доступным, когда старое ядро работает - даже если бы он был, это не имело бы значения, поскольку настоящая проблема во время выполнения заключается в том, что вы фактически вызвали несуществующую часть ядро ABI . Вам не нужны никакие заголовки только для того, чтобы запустить исполняемый файл, поэтому возврат к старому ядру не имеет значения.
Возможно, я параноик, но ...
Да и нет.Если это система, в которой разные люди произвольно меняют местами разные заголовки ядра, чтобы использовать новые функции при компиляции вещей, которые будут оставлены и запущены позже с использованием более старого ядра, то паранойя - уместная реакция, лол. Однако, вероятно, не так много всего попадает в эту категорию.
Дистрибутивы заменяют заголовки ядра при каждом обновлении, но список вещей, которые пользователь должен заменить одновременно, обычно кажется не таким длинным (если он вообще существует). Я полагаю, что это отчасти потому, что поддерживать обратную совместимость в этом контексте довольно просто, но я думаю, что это также потому, что вещи в этом контексте не меняются кардинально с течением времени.
Полагаю, я мог бы сохранить старые заголовки и переустановить их.
Вы можете сделать это или при необходимости заменить их из соответствующего источника ( make headers_install
); если это ядро дистрибутива, и вы беспокоитесь, что они могут быть исправлены, в дистрибутиве должен быть пакет с исходным кодом для него.