web-dev-qa-db-fra.com

Existe-t-il une définition de macro pour vérifier la version du noyau Linux?

Je me demande s'il existe une macro gcc qui me dira la version du noyau Linux afin que je puisse définir les types de variables de manière appropriée. Sinon, comment pourrais-je définir ma propre macro qui fait cela?

28
zztops

Le fichier linux/version.h a une macro appelée KERNEL_VERSION qui vous permettra de vérifier la version souhaitée par rapport à la version actuelle des en-têtes linux (LINUX_VERSION_CODE) installée. Par exemple, pour vérifier si les en-têtes Linux actuels sont pour le noyau v2.6.16 ou antérieur:

#include <linux/version.h>

#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif

Une meilleure façon d'obtenir les informations de version au moment de l'exécution est d'utiliser la fonction utsname dans include/linux/utsname.h .

char *my_kernel_version = utsname()->release;

Voici essentiellement comment /proc/version obtient la version actuelle du noyau.

Voir également

Obtenir la version du noyau à partir du module du noyau linux lors de l'exécution

62
Vilhelm Gray

gcc ne connaîtra pas ces informations. Comme alternative, vous pouvez facilement déterminer un grand nombre d'informations sur le noyau lors de l'exécution.

Vous pouvez définir votre type d'exécution comme

struct unified_foo {
     unsigned int kernel_version;
     union {
         kernel_x_foo_type k_x;
         kernel_y_foo_type k_y;
         kernel_z_foo_type k_z;
     } u;
};

et demandez au code lors de l'exécution de regarder /proc/version (ou tout ce dont vous avez besoin dans l'environnement d'exécution du noyau) et définissez kernel_version de manière appropriée. Le kernel_x_foo_type Et al. est votre type que vous souhaitez conditionner à la version du noyau. Le code appelant doit regarder kernel_version Et accéder aux données u.k_x, u.k_y Ou u.k_z Appropriées.

1
ldav1s