|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.