Annotation of researchv10dc/man/manb/mpx.2, revision 1.1

1.1     ! root        1: .TH MPX 2 
        !             2: .UC 4
        !             3: .SH NAME
        !             4: mpx \- create and manipulate multiplexed files
        !             5: .SH SYNOPSIS
        !             6: .nf
        !             7: .B mpx(name, access)
        !             8: .B char *name;
        !             9: .PP
        !            10: .B join(fd, xd)
        !            11: .PP
        !            12: .B chan(xd)
        !            13: .PP
        !            14: .B extract(i, xd)
        !            15: .PP
        !            16: .B attach(i, xd)
        !            17: .PP
        !            18: .B detach(i, xd)
        !            19: .PP
        !            20: .B connect(fd, cd, end)
        !            21: .PP
        !            22: .B npgrp(i, xd, pgrp)
        !            23: .PP
        !            24: .B ckill(i, xd, signal)
        !            25: .PP
        !            26: .B #include <sys/mx.h>
        !            27: .B mpxcall(cmd, vec)
        !            28: .B int *vec;
        !            29: .fi
        !            30: .SH DESCRIPTION
        !            31: .PP
        !            32: .B mpxcall(cmd, vec)
        !            33: is the system call shared by the 
        !            34: library routines described below.
        !            35: .I Cmd
        !            36: selects a command using values
        !            37: defined in
        !            38: .IR <sys/mx.h> .
        !            39: .I Vec
        !            40: is the address of a
        !            41: structure containing the arguments
        !            42: for the command.
        !            43: .PP
        !            44: .B mpx(name, access)
        !            45: .PP
        !            46: .I Mpx
        !            47: creates and opens the file 
        !            48: .I name
        !            49: with access permission
        !            50: .I access
        !            51: (see
        !            52: .IR creat (2))
        !            53: and returns a file descriptor available for
        !            54: reading and writing.
        !            55: A \-1 is returned if the file cannot be created,
        !            56: if
        !            57: .I name
        !            58: already exists, or
        !            59: if the file table or other operating system
        !            60: data structures are full.
        !            61: The file descriptor is required for use
        !            62: with other routines.
        !            63: .PP
        !            64: If
        !            65: .I name
        !            66: is 0,
        !            67: a file descriptor is returned as described
        !            68: but no entry is created in the file system.
        !            69: .PP
        !            70: Once created an mpx file may be opened
        !            71: (see
        !            72: .IR open (2))
        !            73: by any process.
        !            74: This provides a form of interprocess communication
        !            75: whereby a process B can `call' process A
        !            76: by opening an mpx file 
        !            77: created by A.
        !            78: To B, the file is ordinary with one exception:
        !            79: the
        !            80: .I connect
        !            81: primitive could be applied to it.
        !            82: Otherwise the functions
        !            83: described below are used only in process A
        !            84: and descendants that inherit the open mpx file.
        !            85: .PP
        !            86: When a process opens an mpx file, the owner of the
        !            87: file receives a control message when the file is next read.
        !            88: The method for `answering' 
        !            89: this kind of call involves 
        !            90: using
        !            91: .I attach
        !            92: and
        !            93: .I detach
        !            94: as described in more detail below.
        !            95: .PP
        !            96: Once B has opened A's mpx file
        !            97: it is said to have a
        !            98: .I channel
        !            99: to A.
        !           100: A channel is a pair of data streams:
        !           101: in this case, one from B to A and the
        !           102: other from A to B.
        !           103: Several processes may open the same mpx file
        !           104: yielding multiple channels within the one mpx file.
        !           105: By accessing the appropriate channel,
        !           106: A can communicate with B and any others.
        !           107: When A reads (see
        !           108: .IR read (2))
        !           109: from the mpx file
        !           110: data written to A by the other processes appears
        !           111: in A's buffer using a record format
        !           112: described in
        !           113: .IR mpxio (5).
        !           114: When A writes (see
        !           115: .IR write (2))
        !           116: on its mpx file the data must be formatted in a similar way.
        !           117: .PP
        !           118: The following commands
        !           119: are used to manipulate mpx files and channels.
        !           120: .IP
        !           121: .IR join \-
        !           122: adds a new channel on an mpx file to an open file F.
        !           123: I/O on the new channel is I/O on F.
        !           124: .br
        !           125: .IR chan \-
        !           126: creates a new channel.
        !           127: .br
        !           128: .IR extract \-
        !           129: file descriptor maintenance.
        !           130: .br
        !           131: .IR connect \-
        !           132: similar to join except that the open file F is connected
        !           133: to an existing channel.
        !           134: .br
        !           135: .I attach
        !           136: and
        !           137: .IR detach \-
        !           138: used with call protocol.
        !           139: .br
        !           140: .IR npgrp \-
        !           141: manipulates process group numbers so that a channel
        !           142: can act as a control terminal (see
        !           143: .IR tty (4)).
        !           144: .br
        !           145: .IR ckill \-
        !           146: send signal (see
        !           147: .IR signal (2))
        !           148: to process group through channel.
        !           149: .PP
        !           150: A maximum of 15 channels may be connected to an
        !           151: mpx file.
        !           152: They are numbered 0 through 14.
        !           153: .I Join
        !           154: may be used to make one mpx file appear as a channel
        !           155: on another mpx file.
        !           156: A hierarchy or tree of mpx files may be set up in this way.
        !           157: In this case
        !           158: one of the mpx files must be the root of a tree
        !           159: where the other mpx files are interior nodes.
        !           160: The maximum depth of such a tree
        !           161: is 4.
        !           162: .PP
        !           163: An
        !           164: .I index
        !           165: is a 16-bit value
        !           166: that denotes a location
        !           167: in an mpx tree other than the root:
        !           168: the path through mpx `nodes' from the root
        !           169: to the location is expressed as a sequence of
        !           170: 4-bit nibbles.
        !           171: The branch taken at the root is represented by
        !           172: the low-order 4-bits of an index.
        !           173: Each succeeding branch is specified by the next
        !           174: higher-order nibble.
        !           175: If the length of a path to be expressed
        !           176: is less than 4,
        !           177: then the illegal channel number, 15,
        !           178: must be used to terminate the sequence.
        !           179: This is not strictly necessary for the
        !           180: simple case of a tree consisting of
        !           181: only a root node: its channels
        !           182: can be expressed by the numbers
        !           183: 0 through 14.
        !           184: An index
        !           185: .I i
        !           186: and file descriptor
        !           187: .I xd
        !           188: for the root of an mpx tree are
        !           189: required as arguments to most
        !           190: of the commands described below.
        !           191: Indices also serve as channel identifiers
        !           192: in the record formats given in
        !           193: .IR mpxio (5).
        !           194: Since \-1 is not a valid index,
        !           195: it can be returned as a error indication
        !           196: by subroutines that normally return
        !           197: indices.
        !           198: .PP
        !           199: The operating system informs the process managing an mpx file
        !           200: of changes in the status of channels attached to the file
        !           201: by generating messages that
        !           202: are read along with data from the channels.
        !           203: The form and content of these messages is described
        !           204: in
        !           205: .IR mpxio (5).
        !           206: .PP
        !           207: .B join(fd, xd)
        !           208: establishes a connection (channel) between an mpx file
        !           209: and another object.
        !           210: .I Fd
        !           211: is an open file descriptor for a character device
        !           212: or an mpx file and
        !           213: .I xd
        !           214: is the file descriptor of an
        !           215: mpx file.
        !           216: .I Join
        !           217: returns the index for the new channel
        !           218: if the operation succeeds and \-1
        !           219: if it does not.
        !           220: .PP
        !           221: Following  join,
        !           222: .I fd
        !           223: may still be used in any system call that would
        !           224: have been meaningful before the join operation.
        !           225: Thus
        !           226: a process can read and write directly to
        !           227: .I fd
        !           228: as well as access it via
        !           229: .I xd.
        !           230: If the number of channels
        !           231: required for a tree of mpx files
        !           232: exceeds the number of open files
        !           233: permitted a process by the operating system,
        !           234: some of the file descriptors can be released using
        !           235: the standard  
        !           236: .IR close (2)
        !           237: call.
        !           238: Following a close on an active file descriptor for a channel
        !           239: or internal mpx node,
        !           240: that object may still be accessed through the root of the
        !           241: tree.
        !           242: .PP
        !           243: .B chan(xd)
        !           244: allocates a channel and connects
        !           245: one end of it to the mpx file
        !           246: represented by file descriptor
        !           247: .I xd.
        !           248: .I Chan
        !           249: returns the index of the new channel or
        !           250: a \-1 indicating failure.
        !           251: The
        !           252: .I extract
        !           253: primitive can be used to get a non-multiplexed
        !           254: file descriptor for the free end of a channel
        !           255: created by
        !           256: .I chan.
        !           257: .PP
        !           258: Both
        !           259: .I chan
        !           260: and
        !           261: .I join
        !           262: operate on the mpx file specified by
        !           263: .IR xd .
        !           264: File descriptors for interior nodes of an
        !           265: mpx tree must be preserved or reconstructed with
        !           266: .I extract
        !           267: for use with
        !           268: .I join
        !           269: or
        !           270: .IR chan .
        !           271: For the remaining commands described here,
        !           272: .I xd
        !           273: denotes the file descriptor for the
        !           274: root of an mpx tree.
        !           275: .PP
        !           276: .B extract(i, xd)
        !           277: returns a file descriptor for the object with
        !           278: index
        !           279: .I i
        !           280: on the mpx tree with root file descriptor
        !           281: .I xd.
        !           282: A \-1 is returned by extract if a file descriptor is not available
        !           283: or if the arguments do not refer to an existing
        !           284: channel and mpx file.
        !           285: .PP
        !           286: .B attach(i, xd)
        !           287: .br
        !           288: .BR "detach(i, xd)" .
        !           289: If a process A has created an mpx file represented
        !           290: by file descriptor
        !           291: .I xd,
        !           292: then a process B
        !           293: can open (see
        !           294: .IR open (2))
        !           295: the mpx file.
        !           296: The purpose is to establish a channel between
        !           297: A and B through the mpx file.
        !           298: .I Attach
        !           299: and 
        !           300: .I Detach
        !           301: are used by A to respond to
        !           302: such opens.
        !           303: .PP
        !           304: An open request by B fails immediately if a 
        !           305: new channel cannot be allocated on the mpx file,
        !           306: if the mpx file does not exist,
        !           307: or if it does exist
        !           308: but there is no process (A)
        !           309: with a multiplexed file descriptor
        !           310: for the mpx file
        !           311: (i.e.
        !           312: .I xd
        !           313: as returned by
        !           314: .IR mpx (2)).
        !           315: Otherwise a channel
        !           316: with index number
        !           317: .I i
        !           318: is allocated.
        !           319: The next time A reads on file descriptor
        !           320: .IR xd ,
        !           321: the WATCH control message
        !           322: (see
        !           323: .IR mpxio (5))
        !           324: will be delivered on channel
        !           325: .I i.
        !           326: A  responds to this message with
        !           327: .I attach
        !           328: or 
        !           329: .I detach.
        !           330: The former causes the open to complete and
        !           331: return a file descriptor to B.
        !           332: The latter deallocates channel
        !           333: .I i
        !           334: and causes the open to fail.
        !           335: .PP
        !           336: One mpx file may be placed in `listener' mode.
        !           337: This is done by writing
        !           338: .I "ioctl(xd, MXLSTN, 0)"
        !           339: where
        !           340: .I xd
        !           341: is an mpx file descriptor
        !           342: and MXLSTN is defined in 
        !           343: .IR /usr/include/sgtty.h .
        !           344: The semantics of listener mode are that
        !           345: all file names discovered by 
        !           346: .IR open (2)
        !           347: to have 
        !           348: the syntax
        !           349: .I "system!pathname"
        !           350: (see
        !           351: .IR uucp (1))
        !           352: are treated as opens on the mpx file.
        !           353: The operating system sends the listener process 
        !           354: an OPEN message (see
        !           355: .IR mpxio (5))
        !           356: which includes the file name being opened.
        !           357: .I Attach
        !           358: and
        !           359: .I detach
        !           360: then apply as described above.
        !           361: .PP
        !           362: .I Detach
        !           363: has two other uses:
        !           364: it closes and releases the resources
        !           365: of any active channel it is applied to,
        !           366: and should be used to respond to
        !           367: a CLOSE message (see
        !           368: .IR mpxio (5))
        !           369: on a channel so the channel may be reused.
        !           370: .PP
        !           371: .BR "connect(fd, cd, end)" .
        !           372: .I Fd
        !           373: is a character file descriptor and
        !           374: .I cd
        !           375: is a file descriptor for a channel,
        !           376: such as might be obtained via
        !           377: .I "extract( chan(xd), xd)"
        !           378: or by
        !           379: .IR open (2)
        !           380: followed by
        !           381: .I attach.
        !           382: .I Connect
        !           383: splices the two streams together.
        !           384: If
        !           385: .I end
        !           386: is negative, only
        !           387: the output of
        !           388: .I fd
        !           389: is spliced to the input of
        !           390: .I cd.
        !           391: If
        !           392: .I end
        !           393: is positive, the output of
        !           394: .I cd
        !           395: is spliced to the input of
        !           396: .I fd.
        !           397: If
        !           398: .I end
        !           399: is zero, then both splices are made.
        !           400: .PP
        !           401: .BR "npgrp(i, xd, pgrp)" .
        !           402: If
        !           403: .I xd
        !           404: is negative
        !           405: .I npgrp
        !           406: applies to the process executing it,
        !           407: otherwise
        !           408: .I i
        !           409: and
        !           410: .I xd
        !           411: are interpreted as a channel index and
        !           412: mpx file descriptor
        !           413: and
        !           414: .I npgrp
        !           415: is applied to the process on the
        !           416: non-multiplexed end of the channel.
        !           417: If
        !           418: .I pgrp
        !           419: is zero, the process group number of the indicated process
        !           420: is set to the process number of that process,
        !           421: otherwise the value of
        !           422: .I pgrp
        !           423: is used as the process group number.
        !           424: .PP
        !           425: .I Npgrp
        !           426: normally returns the new process group number.
        !           427: If
        !           428: .I i
        !           429: and
        !           430: .I xd
        !           431: specify  a nonexistent channel,
        !           432: .I npgrp
        !           433: returns \-1.
        !           434: .PP
        !           435: .B ckill(i, xd, signal)
        !           436: sends the specified signal (see
        !           437: .IR signal (2))
        !           438: through the channel specified by
        !           439: .I i
        !           440: and
        !           441: .I xd.
        !           442: If the channel is connected to anything other
        !           443: than a process,
        !           444: .I ckill
        !           445: is a null operation.
        !           446: If there is a process at the other end of the channel,
        !           447: the process group will be interrupted (see
        !           448: .IR signal (2),
        !           449: .IR kill (2)).
        !           450: .I Ckill
        !           451: normally returns 
        !           452: .I signal.
        !           453: If
        !           454: .I ch
        !           455: and
        !           456: .I xd
        !           457: specify a nonexistent channel,
        !           458: .I ckill
        !           459: returns \-1.
        !           460: .SH FILES
        !           461: /usr/include/sys/mx.h
        !           462: .br
        !           463: /usr/include/sgtty.h
        !           464: .SH "SEE ALSO"
        !           465: mpxio(5)
        !           466: .SH BUGS
        !           467: .PP
        !           468: Mpx files are an experimental part of the operating
        !           469: system more subject to change and prone to bugs
        !           470: than other parts.
        !           471: .PP
        !           472: Maintenance programs, e.g.
        !           473: .IR icheck (1),
        !           474: diagnose mpx files as  an illegal mode.
        !           475: .PP
        !           476: Channels may only be connected to objects in the operating
        !           477: system that are accessible through the line discipline
        !           478: mechanism.
        !           479: .PP
        !           480: Higher performance line disciplines are needed.
        !           481: .PP
        !           482: The maximum tree depth restriction is not really checked.
        !           483: .PP
        !           484: A non-destructive
        !           485: .I disconnect
        !           486: primitive (inverse of
        !           487: .IR connect )
        !           488: is not provided.
        !           489: .PP
        !           490: A non-blocking flow control strategy
        !           491: based on messages defined in
        !           492: .IR mpxio (5)
        !           493: should not be attempted by novices;
        !           494: the enabling
        !           495: .I ioctl
        !           496: command should be protected.
        !           497: .PP
        !           498: The
        !           499: .I join
        !           500: operation could be subsumed by
        !           501: .I connect.
        !           502: A mechanism is needed for moving a channel from one
        !           503: location in an mpx tree to another.

unix.superglobalmegacorp.com

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