如何在编译时检测Linux内核是否支持copy_file_range()与ioctl_ficlone()
编译时检测Linux内核4.5及以上版本的方法
copy_file_range()和ioctl_ficlone()这两个系统调用首次出现在Linux 4.5内核中,我们可以通过<linux/version.h>里的宏在编译时判断内核版本,从而选择使用新系统调用还是回退到sendfile()。
核心要点
<linux/version.h>提供了两个关键宏:
LINUX_VERSION_CODE:当前编译环境对应的内核版本编码KERNEL_VERSION(major, minor, patch):将主版本、次版本、补丁号转换为对应的版本编码
手册只给出了4.5未提及补丁号,是因为4.5是该系列的首个版本,对应的完整版本号为4.5.0,补丁号填0即可。
正确的条件判断代码
#include <linux/version.h> #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) /* 使用 ioctl_ficlone() / copy_file_range() */ // 此处编写新系统调用的实现逻辑 #else /* 回退使用 sendfile() */ // 此处编写回退兼容逻辑 #endif
说明
- 所有4.5及以上的内核版本(包括4.5.x补丁版本、4.6及更高主版本)都会满足
LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)的条件 - 这种写法严格遵循
<linux/version.h>的宏定义规则,能准确识别内核版本范围
内容的提问来源于stack exchange,提问作者Madagascar
相关产品推荐
相关产品推荐

