You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在编译时检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:14:53