I just make a mistake about the macro LINUX_VERSION_CODE. Here is what I want to do,when execute the code,the code run different branch due to the machine ,which is running.

I just realized,the result is not change,since I compile my code always in the same server.For example I compile the belw code in kernel version of 2.6.18,then the LINUX_VERSION_CODE marco is always 132626 .

If there is any way ,let the run different branch due to the version of which it runs?

#include <stdio.h> #include <linux/version.h> int main() { printf("kernel version(2.6.32) = %d\n",KERNEL_VERSION(2,6,32)); printf("LINUX_VERSION_CODE = %d\n",LINUX_VERSION_CODE); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) printf("Hello,world.\n"); #else printf("Fine,thank you.\n"); #endif return 0; } 
3

1 Answer

So you want to run a different code depending on kernel version. But you don't want to decide on that using a compile time constant - you want that at runtime.
Nothing simpler, but a call to uname:

#include <sys/utsname.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { struct utsname name; if (uname(&name)) { fprintf(stderr, "Uname failed!\n"); exit(-1); } printf("%s\n", name.release); if (!memcmp(&name.release, "4.18.9-", sizeof("4.18.9-") - 1)) { printf("Och, kernel 4.18.9 found!\n"); } else { printf("Och, you've got a different kernel...\n"); } } 

On my machine:

$ cat 1.c | gcc -xc - && ./a.out 4.18.9-arch1-1-ARCH Och, kernel 4.18.9 found! 

On my friends machine:

cat 1.c | ssh friend 'gcc -xc - && ./a.out' 4.12.14-lp150.11-default Och, you've got a different kernel... 

I will leave it to the OP, to call strtoll or sscanf(&name.release, "%d.%d.%d-", &major, &minor, &release) to get the kernel version as integer number.

But you can get way more hardcore than that. On runtime, you can just do anything, so just read the content of /usr/include/linux/version.h file:

#define _GNU_SOURCE 1 #include <linux/version.h> #include <unistd.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *f; f = fopen("/usr/include/linux/version.h", "r"); if (f == NULL) return -__LINE__; char *line = NULL; size_t linelen = 0; char *found = NULL; while (getline(&line, &linelen, f) > 0) { if ((found = strstr(line, "LINUX_VERSION_CODE")) != NULL) { break; } } if (found == NULL) return -__LINE__; fclose(f); found += sizeof("LINUX_VERSION_CODE") - 1; errno = 0; const long long kv = strtoll(found, NULL, 10); if (errno) return -__LINE__; free(line); printf("%ld.%ld.%ld\n", kv>>16&0xff, kv>>8&0xff, kv&0xff); if (kv > KERNEL_VERSION(4,17,0)) { printf("Och, kernel api greater then 4.17.0 found!\n"); } else { printf("Och, kernel api below 4.17.0 found!\n"); } } 

And on my machine this outputs:

$ cat 1.c | gcc -xc - && ./a.out 4.17.11 Och, kernel api greater then 4.17.0 found! 

And on my friends:

$ cat 1.c | ssh friend 'gcc -xc - && ./a.out' 4.15.0 Och, kernel api below 4.17.0 found! 

We can also see, that uname -a != grep "LINUX_VERSION_CODE" /usr/include/linux/version.h.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy