The functor connect.ozf
provides a simple way
to connect external processes to an Oz process. The user
can freely chose between socket or pipe connections.
The implementation of both kinds of connections
is hidden from the user so that the connection can
be switched easily. This abstraction is typically useful
for Oz written systems that run on various platforms or
with various configurations.
Connect: ShellCmd x unit(args:Args ...) -> unit(stream:String
kill:->
send:String->)
ShellCmd = VirtualString
Args = list(VirtualString)
The external process receives its input on the stream
Connect.stream
and sends its output via
Connect.send
.
connect.ozf
connect.ozf
exports a record
Connect
containing two implementations of
the function Connect:
Connect.pipe
Connect.socket
Both functions can connect external processes but of
different kind:
Connect.pipe
connects external processes that
send input and output to the standard input/output files
(StdIn
and StdOut
).
Connect.socket
connects Oz to external processes.
Such external processes are connected via a socket with port
PortNumber
over which they send their input/output.
To access the socket with PortNumber
the external
process requires an extra option when called from a shell:
The external process behaves as a
--port=PortNumber
PortNumber
(and not
as a server). The external process is started, connects to the
socket with this port, and sends its input and output
to there.
ShellCmd Arg1 ... Argn [--port=PortNumber]
then you can also invoke it from Oz by executing the
following statement (which does not require the port
number):
Kind = socket % pipe
Process = {Connect.Kind ShellCmd unit(args:[Arg1 ... Argn])}
Note that both kinds of connections are established in
analogy. The choice depends only on the value of the
variable Kind
. This makes it very simple
for the user of this package to select and change the
kind of connection required (either socket or pipe).
Process.stream
. You can also send
input to the process by calling Process.send
.
declare [Connect] = {Module.link ['x-ozlib://niehren/external-process/connect.ozf']}
declare Connection = {Connect.pipe cat unit(args:nil)}
{Browse Connection.stream}
{Connection.send hiho}
{Connection.send holladihi}
{Connection.kill}
input-output.oz
provides a generic
way to define input-output interfaces for Oz processes (which
can then be used as external processes).
If you want to write external processes with Oz, then you might want to do it such way that you create both kinds of input-output interfaces for your process. In this case you can frist define an abstract process and then apply it to wrap a concrete interface around.
An abstract procedure is a process that is abstracted
over its input-output interface, i.e. over an input
stream and a procedure to send output:
AbstractProcess: ( string x (string -> ) ) ->
input-output.ozf
input-output.ozf
exports a
record InputOutput
which contains two
procedures InputOutput.standard
and
InputOutput.toSocket
of the following type:
InputOutput.standard: AbstractProcess ->
InputOutput.socket: AbstractProcess ->
The procedure InputOutput.standard turns an
abstract process into a running process which uses standard
input and output. The procedure InputOutput.socket
turns an abstracted process into a process which
accesses a port number when called from the shell
via the following option:
--port=PortNumber
It then sends input and output to the socket with
that port number.
cat
process is turned into an external
process written in Oz that is equipped with a socket
interface for input output.
functor
import
InputOutput at 'x-ozlib://niehren/external-process/input-output.ozf'
Connect at 'x-ozlib://niehren/external-process/connect.ozf'
export
Cat
define
proc{AbstractCat InputStream SendOutput}
Process = {Connect.pipe cat unit(args:nil)}
in
SendOutput = Process.send
InputStream = Process.stream
end
Cat = {InputOutput.socket AbstractCat}
end
niehren-external-process-1.1.pkg
to
a file and execute the following command
in a shell (in the same directory where the file resides):
ozmake --install --package=niehren-external-process-x.x.x.pkg
If you want to extract the source in the actual directory
then call ozmake as follows:
ozmake --extract --package=niehren-external-process-x.x.x.pkg