Annotation of 43BSDReno/old/man/mpx.2, revision 1.1.1.1

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