为什么 Linux 内核有时会实现一个函数的多个版本,它们的名称非常相似,只是包装了另一个函数?例如,这里:
static void clocksource_select(void)
{
__clocksource_select(false);
}
static void clocksource_select_fallback(void)
{
__clocksource_select(true);
}
你举的例子不是很好的例子,因为它与Linux内核无关。这只是基本的软件工程。
当您有两个功能需要非常接近的功能时,您可以采用多种方法。
您可以实现该功能两次。我们不喜欢这样做,因为它会造成代码重复。这也意味着,如果您需要更改代码公共区域的某些内容,则需要记住在两个地方进行更改。
您可以将公共代码拆分为自己的函数,并从每个函数中调用该函数。如果可能,那是最好的解决方案。问题是这并不总是可能的。这可能是不可能的,因为公共代码需要太多上下文,或者因为它需要分布在整个函数中。这使我们有权:
创建一个内部“通用”函数,并带有一个参数,告诉您要提供哪些功能。只需编写代码,并if
在两个函数需要做不同的事情的地方放一个。这是内核在您的示例中采用的路径。
话虽如此,还有另一种情况,特定于 Linux 内核,其中两个功能似乎确实几乎相同。在i386平台上,stat
系统调用不是两次,而是三次:
oldstat
系统调用号 18stat
系统调用号 106stat64
系统调用号 195这样做的原因是 Linux 内核承诺通过其用户空间内核接口完全向后兼容。当一个函数由于某种原因必须被取代时,发生的stat
不是一次,而是两次(如果算上三倍fstatat
),则需要保留旧的系统调用条目并保持可操作性。
但是,如果您查看实际实现,您会注意到它们之间几乎没有区别,并且它们最终都调用了几乎相同的函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句