Pipes in MagiC ab V3.00
-----------------------

Andreas Kromke
24.1.98
letzte nderung:
Tabulatorweite: 5


1. Was sind Pipes ?
===================

Pipes sind Speicherblcke, die zur Kommunikation zwischen
Prozesses (Programmen) verwendet werden. Zur Verwendung der
Pipes werden DOS-Aufrufe (Fcreate(),Fopen(),...) verwendet.
Fr jede Pipe wird eine Pseudo-Datei in U:\PIPE abgelegt.


2. Unidirektionale Pipes
========================

Unidirektionale Pipes werden zur Ein-/Ausgabe-Umlenkung in UNIX-
Shells verwendet, z.B. auch in der Mupfel. Mit "ls | more" wird
eine Pipe erstellt, die Ausgabe von "ls" und die Eingabe von "more"
in die Pipe gelenkt. Fr den asynchronen Datenaustausch sorgt der
Systemkernel ("more" wartet z.B. solange, bis "ls" wieder Daten liefert).
Unidirektionale Pipes knnen ber Fcreate("U:\PIPE\....") oder ber
Fpipe() erstellt werden (=> MGX_DOS.TXT).
Unidirektionale Pipes haben nur einen Puffer (2048 Bytes).


3. Bidirektionale Pipes
=======================

Bidirektionale Pipes werden fr das MultiTOS-konforme Drag&Drop-
Protokoll verwendet. Sie knnen nur ber Fcreate("U:\PIPE\....")
erstellt werden (=> MGX_DOS.TXT).
Bidirektionale Pipes haben zwei Puffer mit je 2048 Bytes. Welcher
der beiden Puffer verwendet wird, hngt vom Aufrufer ab. Hier hat
sich leider aufgrund der etwas diffusen Dokumentation von MiNT eine
kleine Inkompatibilitt in MagiC eingeschlichen, die allerdings in der
blichen Praxis, nmlich beim Drag&Drop, nicht auftritt:

- In MagiC liest der Proze, der die Pipe erstellt hat, immer von
  Puffer 1 und schreibt immer nach Puffer 2.
  Jeder andere Proze, der die Pipe ffnet, liest von Puffer 2 und
  schreibt nach Puffer 1.
- In MiNT liest das von Fcreate() zurckgegebene Handle immer von
  Puffer 1 und schreibt nach Puffer 2.
  Bei jedem (!) weiteren ffnen, egal ob vom selben oder von
  einem anderen Proze, wird immer von Puffer 2 gelesen und nach
  Puffer 1 geschrieben.


4. Varianten
============

Fpipe() erstellt eine unidirektionale Pipe mit Attribut 1; andere
Varianten knnen mit Fcreate() erstellt werden, wobei die Bits des
Attributs folgende Bedeutung erhalten:

	Bit 0 = 0		bidirektionale Pipe (z.B. fr Drag&Drop)
	      = 1		unidirektionale Pipe (z.B. fr I/O-Umlenkung)
	Bit 1 = 0		Schreiben auf eine Pipe, die sonst nicht
	      		zum Lesen geffnet ist, erzeugt kein SIGPIPE-
	      		Signal, sondern wartet ggf. beliebig lange.
	      		Lesen auf eine Pipe, die sonst nicht
	      		zum Schreiben geffnet ist, gibt kein EOF
	      		zurck, sondern wartet beliebig lange.
	      = 1		Schreiben auf eine Pipe, die sonst nicht
				zum Lesen geffnet ist, erzeugt ein SIGPIPE
				Signal.
				Lesen auf eine Pipe, die sonst nicht
				zum Schreiben geffnet ist, erzeugt EOF, d.h. die
				Anzahl der gelesenen Bytes (ggf. 0) wird
				zurckgegeben.
	Bit 2 = 0		Es wird eine "normale" Pipe erstellt.
	      = 1		Es wird ein "Pseudo TTY" erstellt.
	Bit 5 = 0		Lesen von einer Pipe wird erst durch EOF (Pipe
				nicht zum Schreiben geffnet) oder durch Lesen
				aller Bytes beendet.
		 = 1		Lesen wird bereits ohne Warten beendet, wenn
		 		berhaupt ein Byte eingelesen wurde.


5. Einschrnkungen in MagiC
===========================

Es sind nur bis zu 32 Pipes gleichzeitig mglich.

SIGPIPE wird nicht untersttzt, d.h. nie erzeugt.

Pseudo-TTYs werden nicht untersttzt.

In MagiC wird bei Fcreate() nur Bit 0 ausgewertet. Das Verhalten beim
Lesen und Schreiben lt sich nicht beeinflussen, stattdessen wird beim
Lesen von einer nicht zum Schreiben geffneten Pipe sowie beim Schreiben
auf eine nicht zum Lesen geffnete Pipe immer EOF geliefert.

Beim ffnen einer Pipe kann es passieren, da das Handle > 31 ist, dann
ist Fselect() nicht mglich.


6. Anmerkungen
==============

Der Zugriff auf Pipes erfolgt rein asynchron, Applikationen warten auf
Lesen/Schreiben und wecken ggf. beim Lesen/Schrieben eine andere
Applikation wieder auf.

Fseek auf Pipes fhrt grundstztlich zur Rckgabe von 0L (d.h. der
Dateizeiger kann nicht beeinflut werden).

Pipes werden automatisch nach dem Schlieen gelscht. Pipes erscheinen im
Verzeichnis mit der Lnge 2k (unidirektional) bzw. 4k (bidirektional) und
dem korrekten Erstelldatum.