4

sys/queue.h最早出现在 4.4BSD。Linux 已将其包含在其发行版中,但该版本似乎不是最新的。

FreeBSD 版本实现了单链表、单链尾队列、列表和尾队列。Linux 版本实现了列表、尾队列和循环队列。

我在我的 Ubuntu PC 上安装了 libbsd-dev 包,然后sys/queue.h/usr/include/bsd/sys/queue.h.

我的问题:

  • 我在哪里可以找到这个头文件的Linux版本?

  • 这两种实现之间的主要区别是什么?Linux版本只是BSD的过时版本吗?

4

2 回答 2

3

他们有着相同的祖先,但似乎在他们身上所做的任何发展都在很久以前就出现了分歧。

如果你想在你的项目中使用它,你最好的选择是将你最喜欢的一个复制到你的项目中并使用它。不要依赖为您提供它的系统。它只是一个带有一堆宏的头文件,不需要库或任何依赖项即可工作,因此根本不是操作系统特定的。我通常从 OpenBSD 获取我的项目。

于 2013-01-23T16:26:32.990 回答
0

看起来Linux的版本已经严重过时了。自 2001 年以来,CIRCLEQ 在 BSD 中(相当强烈地)被弃用,甚至从文档中删除,即使实现仍在 queue.h 中。我们应该使用 TAILQ,它提供了相同的功能,但性能更好/问题更少/更安全。

同时,在 Linux 中,它甚至仍然有文档记录,但是您可以在 kconfig 中找到从 CIRCLEQ 迁移到 TAILQ 的更改,原因是 BSD 已弃用。

CIRCLEQ 中的具体问题似乎是它使用了一个特定的头,与列表节点不同,但无论如何它都是作为节点链接的;因此,必须在每个节点访问时保留并检查头指针,以查看该节点是否是头。所以有两个问题:每次访问时的检查,以及需要将头指针放在手边,获取寄存器或缓存。

于 2015-08-14T15:25:11.883 回答