tsort

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search
tsort
Initial release1979; 47 years ago (1979)
Repository
  • {{URL|example.com|optional display text}}Lua error in Module:EditAtWikidata at line 29: attempt to index field 'wikibase' (a nil value).
Engine
    Lua error in Module:EditAtWikidata at line 29: attempt to index field 'wikibase' (a nil value).
    Operating systemUnix, Unix-like, V, Inferno
    PlatformCross-platform
    TypeCommand

    The tsort program is a command line utility on Unix and Unix-like platforms, that performs a topological sort on its input. It is part of the POSIX.1 standard.[1] and has been since The Single UNIX Specification, Version 2.[2]

    History

    [edit | edit source]

    According to its info[3] page, this command was initially written for providing an ordering of object files that allowed the linker to process them sequentially (each one exactly once, and in order). The FreeBSD manual page dates its appearance to Version 7 Unix.[4]

    Note that the following description is describing the behavior of the FreeBSD implementation of tsort and mentions GNU features where they may exist. Other implementations or versions may differ.

    Syntax

    [edit | edit source]
    tsort [-dlq] [FILE]
    

    FreeBSD options can be:

    -d         turn on debugging
    -l         search for and display the longest cycle.
    -q         Do not display informational messages about cycles.
    

    GNU provides the following options only:

    --help     display help message and exit
    --version  display version information and exit
    

    There are no options prescribed by POSIX.

    Behavior

    [edit | edit source]

    tsort reads its input (from the given FILE, or standard input if no input file is given or for a FILE of '-') as pairs of strings, separated by blanks, indicating a partial ordering. The output is a total ordering that corresponds to the given partial ordering.[5]

    In other words: for a directed acyclic graph (used as a dependency graph), tsort produces a listing of the vertices so that for all edges 'a->b', 'a' comes before 'b' in the listing.

    Examples

    [edit | edit source]

    tsort lists the vertices of a directed acyclic graph in such an order that all ordering/direction relations are respected:

    $ tsort <<EOF
    > 3 8
    > 3 10
    > 5 11
    > 7 8
    > 7 11
    > 8 9
    > 11 2
    > 11 9
    > 11 10
    > EOF
    3
    5
    7
    11
    8
    10
    2
    9
    
    File:Directed acyclic graph 2.svg
    sample DAG

    Call graph

    [edit | edit source]

    tsort can help rearranging functions in a source file so that as many as possible are defined before they are used (Interpret the following as: main() calls parse_options(), tail_file() and tail_forever(); tail_file() calls pretty_name(), and so on. The result is that dump_remainder() should be defined first, start_lines() second, etc.):

    $ cat call-graph
    main parse_options
    main tail_file
    main tail_forever
    tail_file pretty_name
    tail_file write_header
    tail_file tail
    tail_forever recheck
    tail_forever pretty_name
    tail_forever write_header
    tail_forever dump_remainder
    tail tail_lines
    tail tail_bytes
    tail_lines start_lines
    tail_lines dump_remainder
    tail_lines file_lines
    tail_lines pipe_lines
    tail_bytes xlseek
    tail_bytes start_bytes
    tail_bytes dump_remainder
    tail_bytes pipe_bytes
    file_lines dump_remainder
    recheck pretty_name
    
    $ # note: 'tac' reverses the order
    $ tsort call-graph | tac
    dump_remainder
    start_lines
    file_lines
    pipe_lines
    xlseek
    start_bytes
    pipe_bytes
    tail_lines
    tail_bytes
    pretty_name
    write_header
    tail
    recheck
    parse_options
    tail_file
    tail_forever
    main
    

    Library

    [edit | edit source]

    The traditional ld (Unix linker) requires that its library inputs be sorted in topological order, since it processes files in a single pass. This applies both to static libraries (*.a) and dynamic libraries (*.so), and in the case of static libraries preferably for the individual object files contained within.[6]

    BSD UNIX uses tsort as a common part of the typical ar & ranlib command invocations (from /usr/share/mk/bsd.lib.mk):

    lib${LIB}.a: ${OBJS} ${STATICOBJS}
        @${ECHO} building static ${LIB} library
        @${AR} cq ${.TARGET} `lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
        ${RANLIB} ${.TARGET}
    

    Here lorder ("library order") is used to generate the inter-file dependency list by inspecting the symbol table.

    Usage notes

    [edit | edit source]

    Notice the interchangeability of white space separators so the following inputs are equivalent:

    a b
    b c
    
    a b b
    c
    
    a
    b b c
    
    a b b c
    
    a
    b
    b
    c
    

    Pairs of identical items indicate presence of a vertex, but not ordering (so the following represents one vertex without edges):

    a a
    

    Strictly speaking there is no topological ordering of a graph that contains one or more cycles. However tsort prints a warning and GNU tsort prints the detected cycles to standard error (lines beginning with 'tsort:'):

    $ tsort <<EOF
    > a b
    > b c
    > c a
    > EOF
    UX: tsort: INFORM: cycle in data
    tsort: a
    tsort: b
    tsort: c
    a
    b
    c
    

    See also

    [edit | edit source]

    Lua error in mw.title.lua at line 392: bad argument #2 to 'title.new' (unrecognized namespace name 'Portal').

    POSIX

    [edit | edit source]

    From 1997 until 2024, the POSIX version of the tsort program accepted no arguments other than an optional file name containing the input data (it reads from standard input if no file is specified). With the 2024 version, POSIX specifies an optional -w argument that reports on the number of loops found in the exit status of the command.

    References

    [edit | edit source]
    1. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    2. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    3. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    4. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    5. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    6. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).

    Further reading

    [edit | edit source]
    • Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    • Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    [edit | edit source]

    manual page of tsort on