Linux 为什么要包装函数?
为什么Linux内核有时会使用非常相似的名称实现一个函数的多个版本,而只包装另一个函数?例如:Linux 为什么要包装函数?,linux,kernel,c,Linux,Kernel,C,为什么Linux内核有时会使用非常相似的名称实现一个函数的多个版本,而只包装另一个函数?例如: static void clocksource\u选择(void) { __时钟源_选择(假); } 静态无效时钟源\选择\回退(无效) { __时钟源_选择(真); } 您给出的示例不是一个很好的示例,因为它与Linux内核无关。这只是基本的软件工程 当您有两个功能需要具有非常接近的功能时,您可以采用几种方法 您可以实现该函数两次。我们不喜欢这样做,因为这会造成代码重复。这还意味着,如果您需要更改代
static void clocksource\u选择(void)
{
__时钟源_选择(假);
}
静态无效时钟源\选择\回退(无效)
{
__时钟源_选择(真);
}
您给出的示例不是一个很好的示例,因为它与Linux内核无关。这只是基本的软件工程
当您有两个功能需要具有非常接近的功能时,您可以采用几种方法
if
。这就是内核在您的示例中采用的路径stat
系统调用不是执行两次,而是执行三次:
18号系统调用oldstat
syscall号码106stat
syscall号码195stat64
stat
所发生的情况,不是一次,而是两次(如果您计算fstatat
,则三次),旧的系统调用条目需要保留并保持可操作性
但是,如果您查看实际的实现,您会注意到它们之间的差别很小,它们最终都调用了几乎相同的函数。有时您希望将此函数传递给需要特定签名的其他函数。或者存储在需要特定签名的函数表中。或符合特定的接口。或者只是为了方便/可读性。也可能是其他原因。在您的示例中,您没有注意到两个包装函数传递包装函数的值不同吗?“非常相似的名称,只是包装了另一个函数”,这在这里并没有真正完成
clocksource\u select()
和\u clocksource\u select()
具有不同的函数签名。