📄 queue.3
字号:
.\" Copyright (c) 1993.\" The Regents of the University of California. All rights reserved..\".\" Redistribution and use in source and binary forms, with or without.\" modification, are permitted provided that the following conditions.\" are met:.\" 1. Redistributions of source code must retain the above copyright.\" notice, this list of conditions and the following disclaimer..\" 2. Redistributions in binary form must reproduce the above copyright.\" notice, this list of conditions and the following disclaimer in the.\" documentation and/or other materials provided with the distribution..\" 3. All advertising materials mentioning features or use of this software.\" must display the following acknowledgement:.\" This product includes software developed by the University of.\" California, Berkeley and its contributors..\" 4. Neither the name of the University nor the names of its contributors.\" may be used to endorse or promote products derived from this software.\" without specific prior written permission..\".\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION).\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF.\" SUCH DAMAGE..\".\" @(#)queue.3 8.2 (Berkeley) 1/24/94.\".Dd "January 24, 1994".Dt QUEUE 3.Os BSD 4.Sh NAME.Nm LIST_ENTRY ,.Nm LIST_HEAD ,.Nm LIST_INIT ,.Nm LIST_INSERT_AFTER ,.Nm LIST_INSERT_HEAD ,.Nm LIST_REMOVE ,.Nm TAILQ_ENTRY ,.Nm TAILQ_HEAD ,.Nm TAILQ_INIT ,.Nm TAILQ_INSERT_AFTER ,.Nm TAILQ_INSERT_HEAD ,.Nm TAILQ_INSERT_TAIL ,.Nm TAILQ_REMOVE ,.Nm CIRCLEQ_ENTRY ,.Nm CIRCLEQ_HEAD ,.Nm CIRCLEQ_INIT ,.Nm CIRCLEQ_INSERT_AFTER ,.Nm CIRCLEQ_INSERT_BEFORE ,.Nm CIRCLEQ_INSERT_HEAD ,.Nm CIRCLEQ_INSERT_TAIL ,.Nm CIRCLEQ_REMOVE.Nd implementations of lists, tail queues, and circular queues.Sh SYNOPSIS.Fd #include <sys/queue.h>.sp.Fn LIST_ENTRY "TYPE".Fn LIST_HEAD "HEADNAME" "TYPE".Fn LIST_INIT "LIST_HEAD *head".Fn LIST_INSERT_AFTER "LIST_ENTRY *listelm" "TYPE *elm" "LIST_ENTRY NAME".Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME".Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME".sp.Fn TAILQ_ENTRY "TYPE".Fn TAILQ_HEAD "HEADNAME" "TYPE".Fn TAILQ_INIT "TAILQ_HEAD *head".Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME".Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME".Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME".Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME".sp.Fn CIRCLEQ_ENTRY "TYPE".Fn CIRCLEQ_HEAD "HEADNAME" "TYPE".Fn CIRCLEQ_INIT "CIRCLEQ_HEAD *head".Fn CIRCLEQ_INSERT_AFTER "CIRCLEQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "CIRCLEQ_ENTRY NAME".Fn CIRCLEQ_INSERT_BEFORE "CIRCLEQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "CIRCLEQ_ENTRY NAME".Fn CIRCLEQ_INSERT_HEAD "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME".Fn CIRCLEQ_INSERT_TAIL "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME".Fn CIRCLEQ_REMOVE "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME".Sh DESCRIPTIONThese macros define and operate on three types of data structures:lists, tail queues, and circular queues.All three structures support the following functionality:.Bl -enum -compact -offset indent.ItInsertion of a new entry at the head of the list..ItInsertion of a new entry after any element in the list..ItRemoval of any entry in the list..ItForward traversal through the list..El.PpLists are the simplest of the three data structures and supportonly the above functionality..PpTail queues add the following functionality:.Bl -enum -compact -offset indent.ItEntries can be added at the end of a list..ElHowever:.Bl -enum -compact -offset indent.ItAll list insertions and removals must specify the head of the list..ItEach head entry requires two pointers rather than one..ItCode size is about 15% greater and operations run about 20% slowerthan lists..El.PpCircular queues add the following functionality:.Bl -enum -compact -offset indent.ItEntries can be added at the end of a list..ItEntries can be added before another entry..ItThey may be traversed backwards, from tail to head..ElHowever:.Bl -enum -compact -offset indent.ItAll list insertions and removals must specify the head of the list..ItEach head entry requires two pointers rather than one..ItThe termination condition for traversal is more complex..ItCode size is about 40% greater and operations run about 45% slowerthan lists..El.PpIn the macro definitions,.Fa TYPEis the name of a user defined structure,that must contain a field of type.Li LIST_ENTRY ,.Li TAILQ_ENTRY ,or.Li CIRCLEQ_ENTRY ,named.Fa NAME .The argument.Fa HEADNAMEis the name of a user defined structure that must be declaredusing the macros.Li LIST_HEAD ,.Li TAILQ_HEAD ,or.Li CIRCLEQ_HEAD .See the examples below for further explanation of how thesemacros are used..Sh LISTSA list is headed by a structure defined by the.Nm LIST_HEADmacro.This structure contains a single pointer to the first elementon the list.The elements are doubly linked so that an arbitrary element can beremoved without traversing the list.New elements can be added to the list after an existing element orat the head of the list.A.Fa LIST_HEADstructure is declared as follows:.Bd -literal -offset indentLIST_HEAD(HEADNAME, TYPE) head;.Ed.spwhere.Fa HEADNAMEis the name of the structure to be defined, and.Fa TYPEis the type of the elements to be linked into the list.A pointer to the head of the list can later be declared as:.Bd -literal -offset indentstruct HEADNAME *headp;.Ed.sp(The names.Li headand.Li headpare user selectable.).PpThe macro.Nm LIST_ENTRYdeclares a structure that connects the elements inthe list..PpThe macro.Nm LIST_INITinitializes the list referenced by.Fa head ..PpThe macro.Nm LIST_INSERT_HEADinserts the new element.Fa elmat the head of the list..PpThe macro.Nm LIST_INSERT_AFTERinserts the new element.Fa elmafter the element.Fa listelm ..PpThe macro.Nm LIST_REMOVEremoves the element.Fa elmfrom the list..Sh LIST EXAMPLE.Bd -literalLIST_HEAD(listhead, entry) head;struct listhead *headp; /* List head. */struct entry { ... LIST_ENTRY(entry) entries; /* List. */ ...} *n1, *n2, *np;LIST_INIT(&head); /* Initialize the list. */n1 = malloc(sizeof(struct entry)); /* Insert at the head. */LIST_INSERT_HEAD(&head, n1, entries);n2 = malloc(sizeof(struct entry)); /* Insert after. */LIST_INSERT_AFTER(n1, n2, entries); /* Forward traversal. */for (np = head.lh_first; np != NULL; np = np->entries.le_next) np-> ...while (head.lh_first != NULL) /* Delete. */ LIST_REMOVE(head.lh_first, entries);.Ed.Sh TAIL QUEUESA tail queue is headed by a structure defined by the.Nm TAILQ_HEADmacro.This structure contains a pair of pointers,one to the first element in the tail queue and the other tothe last element in the tail queue.The elements are doubly linked so that an arbitrary element can beremoved without traversing the tail queue.New elements can be added to the tail queue after an existing element,at the head of the tail queue, or at the end of the tail queue.A.Fa TAILQ_HEADstructure is declared as follows:.Bd -literal -offset indentTAILQ_HEAD(HEADNAME, TYPE) head;.Ed.spwhere.Li HEADNAMEis the name of the structure to be defined, and.Li TYPEis the type of the elements to be linked into the tail queue.A pointer to the head of the tail queue can later be declared as:.Bd -literal -offset indentstruct HEADNAME *headp;.Ed.sp(The names.Li headand.Li headpare user selectable.).PpThe macro.Nm TAILQ_ENTRYdeclares a structure that connects the elements inthe tail queue..PpThe macro.Nm TAILQ_INITinitializes the tail queue referenced by.Fa head ..PpThe macro.Nm TAILQ_INSERT_HEADinserts the new element.Fa elmat the head of the tail queue..PpThe macro.Nm TAILQ_INSERT_TAILinserts the new element.Fa elmat the end of the tail queue..PpThe macro.Nm TAILQ_INSERT_AFTERinserts the new element.Fa elmafter the element.Fa listelm ..PpThe macro.Nm TAILQ_REMOVEremoves the element.Fa elmfrom the tail queue..Sh TAIL QUEUE EXAMPLE.Bd -literalTAILQ_HEAD(tailhead, entry) head;struct tailhead *headp; /* Tail queue head. */struct entry { ... TAILQ_ENTRY(entry) entries; /* Tail queue. */ ...} *n1, *n2, *np;TAILQ_INIT(&head); /* Initialize the queue. */n1 = malloc(sizeof(struct entry)); /* Insert at the head. */TAILQ_INSERT_HEAD(&head, n1, entries);n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */TAILQ_INSERT_TAIL(&head, n1, entries);n2 = malloc(sizeof(struct entry)); /* Insert after. */TAILQ_INSERT_AFTER(&head, n1, n2, entries); /* Forward traversal. */for (np = head.tqh_first; np != NULL; np = np->entries.tqe_next) np-> ... /* Delete. */while (head.tqh_first != NULL) TAILQ_REMOVE(&head, head.tqh_first, entries);.Ed.Sh CIRCULAR QUEUESA circular queue is headed by a structure defined by the.Nm CIRCLEQ_HEADmacro.This structure contains a pair of pointers,one to the first element in the circular queue and the other to thelast element in the circular queue.The elements are doubly linked so that an arbitrary element can beremoved without traversing the queue.New elements can be added to the queue after an existing element,before an existing element, at the head of the queue, or at the endof the queue.A.Fa CIRCLEQ_HEADstructure is declared as follows:.Bd -literal -offset indentCIRCLEQ_HEAD(HEADNAME, TYPE) head;.Ed.spwhere.Li HEADNAMEis the name of the structure to be defined, and.Li TYPEis the type of the elements to be linked into the circular queue.A pointer to the head of the circular queue can later be declared as:.Bd -literal -offset indentstruct HEADNAME *headp;.Ed.sp(The names.Li headand.Li headpare user selectable.).PpThe macro.Nm CIRCLEQ_ENTRYdeclares a structure that connects the elements inthe circular queue..PpThe macro.Nm CIRCLEQ_INITinitializes the circular queue referenced by.Fa head ..PpThe macro.Nm CIRCLEQ_INSERT_HEADinserts the new element.Fa elmat the head of the circular queue..PpThe macro.Nm CIRCLEQ_INSERT_TAILinserts the new element.Fa elmat the end of the circular queue..PpThe macro.Nm CIRCLEQ_INSERT_AFTERinserts the new element.Fa elmafter the element.Fa listelm ..PpThe macro.Nm CIRCLEQ_INSERT_BEFOREinserts the new element.Fa elmbefore the element.Fa listelm ..PpThe macro.Nm CIRCLEQ_REMOVEremoves the element.Fa elmfrom the circular queue..Sh CIRCULAR QUEUE EXAMPLE.Bd -literalCIRCLEQ_HEAD(circleq, entry) head;struct circleq *headp; /* Circular queue head. */struct entry { ... CIRCLEQ_ENTRY entries; /* Circular queue. */ ...} *n1, *n2, *np;CIRCLEQ_INIT(&head); /* Initialize the circular queue. */n1 = malloc(sizeof(struct entry)); /* Insert at the head. */CIRCLEQ_INSERT_HEAD(&head, n1, entries);n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */CIRCLEQ_INSERT_TAIL(&head, n1, entries);n2 = malloc(sizeof(struct entry)); /* Insert after. */CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries);n2 = malloc(sizeof(struct entry)); /* Insert before. */CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries); /* Forward traversal. */for (np = head.cqh_first; np != (void *)&head; np = np->entries.cqe_next) np-> ... /* Reverse traversal. */for (np = head.cqh_last; np != (void *)&head; np = np->entries.cqe_prev) np-> ... /* Delete. */while (head.cqh_first != (void *)&head) CIRCLEQ_REMOVE(&head, head.cqh_first, entries);.Ed.Sh HISTORYThe.Nm queuefunctions first appeared in 4.4BSD.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -