Annotation of 43BSDReno/share/doc/ps1/06.sysman/1.5.t, revision 1.1

1.1     ! root        1: .\" Copyright (c) 1983 Regents of the University of California.
        !             2: .\" All rights reserved.  The Berkeley software License Agreement
        !             3: .\" specifies the terms and conditions for redistribution.
        !             4: .\"
        !             5: .\"    @(#)1.5.t       6.3 (Berkeley) 5/12/86
        !             6: .\"
        !             7: .sh Descriptors
        !             8: .PP
        !             9: .NH 3
        !            10: The reference table
        !            11: .PP
        !            12: Each process has access to resources through
        !            13: \fIdescriptors\fP.  Each descriptor is a handle allowing
        !            14: the process to reference objects such as files, devices
        !            15: and communications links.
        !            16: .PP
        !            17: Rather than allowing processes direct access to descriptors, the system
        !            18: introduces a level of indirection, so that descriptors may be shared
        !            19: between processes.  Each process has a \fIdescriptor reference table\fP,
        !            20: containing pointers to the actual descriptors.  The descriptors
        !            21: themselves thus have multiple references, and are reference counted by the
        !            22: system.
        !            23: .PP
        !            24: Each process has a fixed size descriptor reference table, where
        !            25: the size is returned by the \fIgetdtablesize\fP call:
        !            26: .DS
        !            27: nds = getdtablesize();
        !            28: result int nds;
        !            29: .DE
        !            30: and guaranteed to be at least 20.  The entries in the descriptor reference
        !            31: table are referred to by small integers; for example if there
        !            32: are 20 slots they are numbered 0 to 19.
        !            33: .NH 3
        !            34: Descriptor properties
        !            35: .PP
        !            36: Each descriptor has a logical set of properties maintained
        !            37: by the system and defined by its \fItype\fP.
        !            38: Each type supports a set of operations;
        !            39: some operations, such as reading and writing, are common to several
        !            40: abstractions, while others are unique.
        !            41: The generic operations applying to many of these types are described
        !            42: in section 2.1.  Naming contexts, files and directories are described in
        !            43: section 2.2.  Section 2.3 describes communications domains and sockets.
        !            44: Terminals and (structured and unstructured) devices are described
        !            45: in section 2.4.
        !            46: .NH 3
        !            47: Managing descriptor references
        !            48: .PP
        !            49: A duplicate of a descriptor reference may be made by doing
        !            50: .DS
        !            51: new = dup(old);
        !            52: result int new; int old;
        !            53: .DE
        !            54: returning a copy of descriptor reference \fIold\fP indistinguishable from
        !            55: the original.  The \fInew\fP chosen by the system will be the
        !            56: smallest unused descriptor reference slot.
        !            57: A copy of a descriptor reference may be made in a specific slot
        !            58: by doing
        !            59: .DS
        !            60: dup2(old, new);
        !            61: int old, new;
        !            62: .DE
        !            63: The \fIdup2\fP call causes the system to deallocate the descriptor reference
        !            64: current occupying slot \fInew\fP, if any, replacing it with a reference
        !            65: to the same descriptor as old.
        !            66: This deallocation is also performed by:
        !            67: .DS
        !            68: close(old);
        !            69: int old;
        !            70: .DE
        !            71: .NH 3
        !            72: Multiplexing requests
        !            73: .PP
        !            74: The system provides a
        !            75: standard way to do
        !            76: synchronous and asynchronous multiplexing of operations.
        !            77: .PP
        !            78: Synchronous multiplexing is performed by using the \fIselect\fP call
        !            79: to examine the state of multiple descriptors simultaneously,
        !            80: and to wait for state changes on those descriptors.
        !            81: Sets of descriptors of interest are specified as bit masks,
        !            82: as follows:
        !            83: .DS
        !            84: #include <sys/types.h>
        !            85: 
        !            86: nds = select(nd, in, out, except, tvp);
        !            87: result int nds; int nd; result fd_set *in, *out, *except;
        !            88: struct timeval *tvp;
        !            89: 
        !            90: FD_ZERO(&fdset);
        !            91: FD_SET(fd, &fdset);
        !            92: FD_CLR(fd, &fdset);
        !            93: FD_ISSET(fd, &fdset);
        !            94: int fs; fs_set fdset;
        !            95: .DE
        !            96: The \fIselect\fP call examines the descriptors
        !            97: specified by the
        !            98: sets \fIin\fP, \fIout\fP and \fIexcept\fP, replacing
        !            99: the specified bit masks by the subsets that select true for input,
        !           100: output, and exceptional conditions respectively (\fInd\fP
        !           101: indicates the number of file descriptors specified by the bit masks).
        !           102: If any descriptors meet the following criteria,
        !           103: then the number of such descriptors is returned in \fInds\fP and the
        !           104: bit masks are updated.
        !           105: .if n .ds bu *
        !           106: .if t .ds bu \(bu
        !           107: .IP \*(bu
        !           108: A descriptor selects for input if an input oriented operation
        !           109: such as \fIread\fP or \fIreceive\fP is possible, or if a
        !           110: connection request may be accepted (see section 2.3.1.4).
        !           111: .IP \*(bu
        !           112: A descriptor selects for output if an output oriented operation
        !           113: such as \fIwrite\fP or \fIsend\fP is possible, or if an operation
        !           114: that was ``in progress'', such as connection establishment,
        !           115: has completed (see section 2.1.3).
        !           116: .IP \*(bu
        !           117: A descriptor selects for an exceptional condition if a condition
        !           118: that would cause a SIGURG signal to be generated exists (see section 1.3.2),
        !           119: or other device-specific events have occurred.
        !           120: .LP
        !           121: If none of the specified conditions is true, the operation
        !           122: waits for one of the conditions to arise,
        !           123: blocking at most the amount of time specified by \fItvp\fP.
        !           124: If \fItvp\fP is given as 0, the \fIselect\fP waits indefinitely.
        !           125: .PP
        !           126: Options affecting I/O on a descriptor
        !           127: may be read and set by the call:
        !           128: .DS
        !           129: ._d
        !           130: dopt = fcntl(d, cmd, arg)
        !           131: result int dopt; int d, cmd, arg;
        !           132: 
        !           133: /* interesting values for cmd */
        !           134: #define        F_SETFL 3       /* set descriptor options */
        !           135: #define        F_GETFL 4       /* get descriptor options */
        !           136: #define        F_SETOWN        5       /* set descriptor owner (pid/pgrp) */
        !           137: #define        F_GETOWN        6       /* get descriptor owner (pid/pgrp) */
        !           138: .DE
        !           139: The F_SETFL \fIcmd\fP may be used to set a descriptor in 
        !           140: non-blocking I/O mode and/or enable signaling when I/O is
        !           141: possible.  F_SETOWN may be used to specify a process or process
        !           142: group to be signaled when using the latter mode of operation
        !           143: or when urgent indications arise.
        !           144: .PP
        !           145: Operations on non-blocking descriptors will
        !           146: either complete immediately,
        !           147: note an error EWOULDBLOCK,
        !           148: partially complete an input or output operation returning a partial count,
        !           149: or return an error EINPROGRESS noting that the requested operation is
        !           150: in progress.
        !           151: A descriptor which has signalling enabled will cause the specified process
        !           152: and/or process group
        !           153: be signaled, with a SIGIO for input, output, or in-progress
        !           154: operation complete, or
        !           155: a SIGURG for exceptional conditions.
        !           156: .PP
        !           157: For example, when writing to a terminal
        !           158: using non-blocking output,
        !           159: the system will accept only as much data as there is buffer space for
        !           160: and return; when making a connection on a \fIsocket\fP, the operation may
        !           161: return indicating that the connection establishment is ``in progress''.
        !           162: The \fIselect\fP facility can be used to determine when further
        !           163: output is possible on the terminal, or when the connection establishment
        !           164: attempt is complete.
        !           165: .NH 3
        !           166: Descriptor wrapping.\(dg
        !           167: .PP
        !           168: .FS
        !           169: \(dg The facilities described in this section are not included
        !           170: in 4.3BSD.
        !           171: .FE
        !           172: A user process may build descriptors of a specified type by
        !           173: \fIwrapping\fP a communications channel with a system supplied protocol
        !           174: translator:
        !           175: .DS
        !           176: new = wrap(old, proto)
        !           177: result int new; int old; struct dprop *proto;
        !           178: .DE
        !           179: Operations on the descriptor \fIold\fP are then translated by the
        !           180: system provided protocol translator into requests on the underlying
        !           181: object \fIold\fP in a way defined by the protocol.
        !           182: The protocols supported by the kernel may vary from system to system
        !           183: and are described in the programmers manual.
        !           184: .PP
        !           185: Protocols may be based on communications multiplexing or a rights-passing
        !           186: style of handling multiple requests made on the same object.  For instance,
        !           187: a protocol for implementing a file abstraction may or may not include
        !           188: locally generated ``read-ahead'' requests.  A protocol that provides for
        !           189: read-ahead may provide higher performance but have a more difficult
        !           190: implementation.
        !           191: .PP
        !           192: Another example is the terminal driving facilities.  Normally a terminal
        !           193: is associated with a communications line, and the terminal type
        !           194: and standard terminal access protocol are wrapped around a synchronous
        !           195: communications line and given to the user.  If a virtual terminal
        !           196: is required, the terminal driver can be wrapped around a communications
        !           197: link, the other end of which is held by a virtual terminal protocol
        !           198: interpreter.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.