gpt4 book ai didi

linux - 为什么要包装函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:37 25 4
gpt4 key购买 nike

为什么 Linux 内核有时会实现一个函数的多个版本,这些函数的名称非常相似,只是包装了另一个函数?例如,here :

static void clocksource_select(void)
{
__clocksource_select(false);
}

static void clocksource_select_fallback(void)
{
__clocksource_select(true);
}

最佳答案

你举的例子不是一个很好的例子,因为它与Linux内核无关。这只是基本的软件工程。

当您有两个功能需要非常接近的功能时,您可以采用多种方法。

  1. 您可以实现该功能两次。我们不喜欢这样做,因为它会造成代码重复。这也意味着如果您需要在代码的公共(public)区域更改某些内容,您需要记住在两个地方进行更改。

  2. 您可以将通用代码拆分成自己的函数,然后从每个函数中调用该函数。这是最好的解决方案如果可能的话。问题是这并不总是可能的。这可能是不可能的,因为公共(public)代码需要太多的上下文,或者因为它需要分散到整个函数中。这使我们有权:

  3. 创建一个内部“通用”函数,并通过一个参数说明要提供的功能。只需编写代码,并在两个函数需要执行不同操作的地方放置一个if。这就是内核在您的示例中采用的路径。

话虽如此,还有另一种情况,特定于 Linux 内核,其中两个功能确实看起来几乎相同。在i386平台上,stat系统调用不是执行了两次,而是执行了三次:

  • oldstat 系统调用编号 18
  • stat 系统调用号 106
  • stat64 系统调用编号 195

原因是 Linux 内核 promise 完全向后兼容其用户空间内核接口(interface)。当一个函数由于某种原因必须被取代时,stat 发生的不是一次,而是两次(如果算上 fstatat 则为三次),旧的系统调用条目需要保留并保持运行。

但是,如果您查看实际实现,您会发现它们之间几乎没有区别,而且它们最终都调用了几乎相同的函数。

关于linux - 为什么要包装函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47227067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com