IPC via named pipe: Difference between revisions

Added FreeBASIC
m (→‎{{header|Wren}}: Added a libheader and corrected a filename.)
(Added FreeBASIC)
 
(3 intermediate revisions by 2 users not shown)
Line 12:
=={{header|C}}==
{{libheader|pthread}}
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
Line 102:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="vbnet">#Include "file.bi"
 
Type FileInfo
As String path
As Integer oflag
End Type
 
Function OpenFile(file As FileInfo) As Integer
Dim As Integer f = Freefile
Open file.path For Binary Access Read Write As #f
If Lof(f) > 0 Then
Print "Error opening file"
Return -1
End If
Return f
End Function
 
Function ReadFromFile(f As Integer, Byref buf As String, size As Integer) As Integer
Get #f, , buf
Return Len(buf)
End Function
 
Sub WriteToFile(f As Integer, buf As String, size As Integer)
Put #f, , buf
End Sub
 
Dim As FileInfo inputFile
inputFile.path = "in.fifo"
inputFile.oflag = 0
 
Dim As FileInfo outputFile
outputFile.path = "out.fifo"
outputFile.oflag = 1
 
Dim As Integer entrada = OpenFile(inputFile)
Dim As Integer salida = OpenFile(outputFile)
 
If entrada = -1 Or salida = -1 Then
Print "Error opening files"
End
End If
 
Dim As String buffer
Dim As Integer bytesRead
Do
bytesRead = ReadFromFile(entrada, buffer, 64)
If bytesRead > 0 Then WriteToFile(salida, buffer, bytesRead)
Loop</syntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 177 ⟶ 227:
output.Close()
}
}</langsyntaxhighlight>
 
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight Perllang="perl"># 20200924 added Perl programming solution
 
use strict;
Line 214 ⟶ 264:
}
sleep .5;
}</langsyntaxhighlight>
{{out}}
Terminal 1
Line 241 ⟶ 291:
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\IPC_via_named_pipe.exw
Line 322 ⟶ 372:
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">call_named_pipe</span><span style="color: #0000FF;">(</span><span style="color: #000000;">szPipename</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"quit"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</langsyntaxhighlight>-->
{{out}}
After letting it run for about 5s before hitting escape, on separate terminal windows:
Line 337 ⟶ 387:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(call 'mkfifo "in" "out") # Create pipes
 
(zero *Cnt) # Initialize byte counter
Line 356 ⟶ 406:
 
(push '*Bye '(call 'rm "in" "out")) # Remove pipes upon exit
(wait) # (Terminate with Ctrl-C)</langsyntaxhighlight>
Test:
<pre>$ line <out
Line 368 ⟶ 418:
 
=={{header|Racket}}==
<langsyntaxhighlight Racketlang="racket">#lang racket
 
(define-values (in out) (make-pipe))
Line 391 ⟶ 441:
 
(thread-wait t1)
(thread-wait t2)</langsyntaxhighlight>
 
=={{header|Raku}}==
{{incorrect|Raku| Blocks on the read pipe and not able to empty/update the write pipe according to the task requirement }}
Couldn't figure out how to get around the IO blockages as per the talk page so any help would be appreciated, thanks in advance.
<syntaxhighlight lang="raku" perl6line># 20200923 Added Raku programming solution
 
use NativeCall;
Line 429 ⟶ 479:
}
sleep ½;
}</langsyntaxhighlight>
{{out}}
Terminal 1
Line 459 ⟶ 509:
{{works with|Unix}}
 
<langsyntaxhighlight lang="ruby">require 'socket'
 
# Ruby has no direct access to mkfifo(2). We use a shell script.
Line 519 ⟶ 569:
end
end
end</langsyntaxhighlight>
 
Example run:
Line 537 ⟶ 587:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl"># Make the pipes by calling a subprocess...
exec sh -c {test -p in || mkfifo in || exit 1;test -p out || exec mkfifo out}
 
Line 568 ⟶ 618:
 
# Run the event loop until done
vwait forever</langsyntaxhighlight>
 
=={{header|Wren}}==
Line 578 ⟶ 628:
 
This works fine on Ubuntu 20.04 and should work on other Linux distros though I can't vouch for anything else.
<langsyntaxhighlight ecmascriptlang="wren">/* ipc_via_named_pipeIPC_via_named_pipe.wren */
 
var InputFifo = "in"
Line 631 ⟶ 681:
 
Fifo.make(InputFifo, 438)
Fifo.make(OutputFifo, 438)</langsyntaxhighlight>
<br>
We now embed this script in the following C program, build and run from one terminal.
<langsyntaxhighlight lang="c">/* gcc ipc_via_named_pipeIPC_via_named_pipe.c -o ipc_via_named_pipeIPC_via_named_pipe -lpthread -lwren -lm */
 
#include <stdio.h>
Line 783 ⟶ 833:
vm2 = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "ipc_via_named_pipeIPC_via_named_pipe.wren";
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
Line 799 ⟶ 849:
pthread_t pid;
pthread_create(&pid, 0, write_loop, 0);
read_loop();
wrenFreeVM(vm);
wrenFreeVM(vm2);
free(script);
return 0;
}</langsyntaxhighlight>
<br>
{{out}}
Line 822 ⟶ 872:
zkl doesn't open pipes but it knows about them (on Unix anyway as they are just a file). So, outside of the program, create two named pipes and read/write to them inside the program.
{{trans|C}}
<langsyntaxhighlight lang="zkl">pipe:=Thread.Pipe(); // NOT a Unix pipe, for inter-thread commication
fcn writeLoop(pipe){ // a thread
out:=File("out","w");
Line 839 ⟶ 889:
}.launch(pipe);
 
while(1){ Atomic.sleep(10000); } // veg out while other talk</langsyntaxhighlight>
{{out}}
Terminal 1:
2,139

edits