Thanks for all the answers.
Indeed it was good that I asked and you updated the documentation,
because it was not clear that the function was launching a process
rather than opening a named pipe - which is what I was expecting.
Maybe it is a good idea to add the named pipe functionality with a
dedicated create-pipe word, because using the mkfifo shell command works
indeed, but is not entirely straightforward to use.
The way I made it work somewhat satisfactory was by detaching the launch
by using
s" mkfifo /tmp/pipename&" system
and then waiting for the pipe to be created in a begin...until cycle
before using it with open-file.
A dedicated create-pipe would take care of that and return a proper
result code. Or it could be a pipe (fam -- fam) access method for the
files wordset.
A second caveat is that I did not see a way to send O_NONBLOCK to
open-file, so I had to carefully arrange the order of openings to avoid
deadlocks. It would be nice to have a nonblock fam added.
Thanks again,
Elko
On 10/07/2025 10.34, Anton Ertl wrote:
On Tue, Jul 08, 2025 at 01:59:18PM +0300, Elko Tchernev wrote:
Do pipes in gforth work at all? (Not Gforth in pipes, that works.)
I have now documented OPEN-PIPE: 'open-pipe' ( c-addr u wfam - wfileid
wior ) gforth-0.2 "open-pipe" c-addr u is the name/path of an OS-level
program. If wfam is 'r/o', the standard output of the program is piped
into the Gforth process and can be read from wfileid. If wfam is
'w/o', data written to wfileid is piped as standard input into the
program. wior is 0 if and only if opening the pipe succeeded.
I'd appreciate a single working example where two gforth instances
open a pipe and communicate through it
That would start with something like s" gforth
<command-line-parameters>" r/o open-pipe throw for reading the
standard output of the child gforth or using w/o for writing to the
standard input of the child gforth. Let's do a simpler example: s" cat
-n" w/o open-pipe throw constant catpipe ' words catpipe
outfile-execute catpipe close-pipe throw .
s" mkfifo /tmp/trrr" system ok
This would be a good start for communicating between two pre-existing
instances of Gforth. You would then open /tmp/trrr with open-file on
both sides, however. Finally, unix/pthread.fs contains a word
create_pipe that is intended for creating a pipe to be used between
threads in a single gforth process (although you could then also fork
and have two separate gforth processes that communicate through the
pipe). For now this is only an internal word for our multitasker, so
you have to study the source to make use of it. - anton