在哪里可以找到Linux版本的sys/queue.h头文件?

4

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

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

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

我的问题:

  • 我应该在哪里找到 Linux 版本的此头文件?

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


1
你可以在/usr/include/i386-linux-gnu/sys/queue.h下找到它。 - knittl
位置取决于您的发行版。在我的Debian系统中,queue.h位于linux-headers软件包中。 - Martin
2个回答

3
他们有相同的血统,但看起来它们之间的任何发展已经分歧很久了。
如果你想在你的项目中使用它,最好的办法就是将你最喜欢的那个复制到你的项目中并使用它。不要依赖系统为你提供它。它只是一个带有一堆宏的头文件,不需要库或任何依赖项即可工作,因此根本不是操作系统特定的。我通常会在我的项目中使用OpenBSD的那个。

你可以在这里找到OpenBSD的代码:https://github.com/openbsd/src/blob/master/sys/sys/queue.h - ComFreek

0

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

与此同时,在Linux中它仍然被记录在案,但是你可以在kconfig中找到从CIRCLEQ迁移到TAILQ的变化,引用了BSD的弃用。

CIRCLEQ中的具体问题似乎是它使用一个特定的头部,不同于列表节点,但是它仍然被链接为一个节点;因此,头指针必须保留并在每个节点访问时进行检查,以查看节点是否最终成为头部。因此,存在两个问题:每次访问时的检查以及需要手头保留头指针,占用寄存器或缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接