2016-04-07 18:48 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
+ tests/pipes.prg
+ added demonstration/test code for communication between processes
by unnamed pipes. The final output is send to stderr and can be
redirected to file by 2> pipes.log
This commit is contained in:
@@ -10,6 +10,12 @@
|
|||||||
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
|
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
2016-04-07 18:48 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||||
|
+ tests/pipes.prg
|
||||||
|
+ added demonstration/test code for communication between processes
|
||||||
|
by unnamed pipes. The final output is send to stderr and can be
|
||||||
|
redirected to file by 2> pipes.log
|
||||||
|
|
||||||
2016-04-07 18:34 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
2016-04-07 18:34 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||||
* src/common/hbprintf.c
|
* src/common/hbprintf.c
|
||||||
* pacified warning
|
* pacified warning
|
||||||
|
|||||||
193
tests/pipes.prg
Normal file
193
tests/pipes.prg
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* demonstration/test code for communication
|
||||||
|
* between processes by unnamed pipes.
|
||||||
|
*
|
||||||
|
* Copyright 2016 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#xcommand ? [<cmd,...>] => msg( <cmd> )
|
||||||
|
request HB_GT_CGI_DEFAULT
|
||||||
|
static s_lChild := .F.
|
||||||
|
|
||||||
|
proc main( xChild )
|
||||||
|
local hProcess, hStdIn, hStdOut
|
||||||
|
local n, nTimeout, nWrLim, nSent, nRead
|
||||||
|
local cToSend, cBuffer, cProg
|
||||||
|
local cSrvData, cCliData, cRead, cError
|
||||||
|
|
||||||
|
s_lChild := !Empty( xChild )
|
||||||
|
|
||||||
|
nTimeout := 1000
|
||||||
|
|
||||||
|
#if defined( __PLATFORM__UNIX )
|
||||||
|
n := 10000
|
||||||
|
nWrLim := 100000
|
||||||
|
#else
|
||||||
|
n := 1000
|
||||||
|
nWrLim := 10000
|
||||||
|
// nWrLim := 4096
|
||||||
|
#endif
|
||||||
|
cToSend := "ABCDEFGHIJKLMNOP"
|
||||||
|
cSrvData := repl( left( cToSend, 16 - len( hb_eol() ) ) + hb_eol(), n )
|
||||||
|
cCliData := lower( cSrvData )
|
||||||
|
cBuffer := space( 10000000 )
|
||||||
|
|
||||||
|
if s_lChild
|
||||||
|
? "process started"
|
||||||
|
if xChild == "STDOUT"
|
||||||
|
? "this is OUTPUT only test"
|
||||||
|
outStd( "Child is happy to send this data :-)" + hb_eol() )
|
||||||
|
outStd( "Bye Bye" + hb_eol() )
|
||||||
|
errorLevel( 123 )
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
? "waiting..."
|
||||||
|
hb_idleSleep( 2.0 )
|
||||||
|
|
||||||
|
? "reading..."
|
||||||
|
cRead := ""
|
||||||
|
nRead := 0
|
||||||
|
while .t.
|
||||||
|
n := hb_PRead( 0, @cBuffer,, nTimeout )
|
||||||
|
if n == -1
|
||||||
|
? "error during reading:", FError()
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
cRead += left( cBuffer, n )
|
||||||
|
nRead += n
|
||||||
|
? "bytes read:", n, ", total:", nRead, ", error:", FError()
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
? "READ DONE =>", iif( cRead == cSrvData, "OK", "ERR" )
|
||||||
|
? "writing..."
|
||||||
|
cToSend := cCliData
|
||||||
|
nSent := 0
|
||||||
|
while len( cToSend ) > 0
|
||||||
|
n := hb_PWrite( 1, cToSend, nWrLim, nTimeout )
|
||||||
|
if n == -1
|
||||||
|
? "error during writing:", FError()
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
nSent += n
|
||||||
|
? "bytes sent:", n, ", total:", nSent, ", error:", FError()
|
||||||
|
if n > 0
|
||||||
|
cToSend := substr( cToSend, n + 1 )
|
||||||
|
endif
|
||||||
|
if nWrLim != NIL
|
||||||
|
hb_idleSleep( 0.1 )
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
else
|
||||||
|
cProg := hb_argv( 0 ) + " x"
|
||||||
|
|
||||||
|
? repl( "=", 40 )
|
||||||
|
|
||||||
|
? "process started"
|
||||||
|
? "opening child process:", cProg
|
||||||
|
hProcess = hb_processOpen( cProg, @hStdIn, @hStdOut )
|
||||||
|
if hProcess == -1
|
||||||
|
? "Cannot create child process..."
|
||||||
|
else
|
||||||
|
? "child started, PID =", hProcess, ", stdin =", hStdIn, ", stdout =", hStdOut
|
||||||
|
? "writing..."
|
||||||
|
cToSend := cSrvData
|
||||||
|
nSent := 0
|
||||||
|
while len( cToSend ) > 0
|
||||||
|
n := hb_PWrite( hStdIn, cToSend,, nTimeout )
|
||||||
|
if n == -1
|
||||||
|
? "error during writing:", FError()
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
nSent += n
|
||||||
|
? "bytes sent:", n, ", total:", nSent, ", error:", FError()
|
||||||
|
if n > 0
|
||||||
|
cToSend := substr( cToSend, n + 1 )
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
FClose( hStdIn )
|
||||||
|
? "WRITE DONE"
|
||||||
|
? "reading..."
|
||||||
|
cRead := ""
|
||||||
|
nRead := 0
|
||||||
|
while .t.
|
||||||
|
n := hb_PRead( hStdOut, @cBuffer,, nTimeout )
|
||||||
|
if n == -1
|
||||||
|
? "error during reading:", FError()
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
cRead += left( cBuffer, n )
|
||||||
|
nRead += n
|
||||||
|
? "bytes read:", n, ", total:", nRead, ", error:", FError()
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
? "READ DONE =>", iif( cRead == cCliData, "OK", "ERR" )
|
||||||
|
FClose( hStdOut )
|
||||||
|
? "process result:", hb_processValue( hProcess )
|
||||||
|
endif
|
||||||
|
|
||||||
|
? repl( "=", 40 )
|
||||||
|
|
||||||
|
? "running child process:", cProg
|
||||||
|
? "result:", hb_processRun( cProg, cSrvData, @cRead )
|
||||||
|
? "READ DONE =>", iif( cRead == cCliData, "OK", "ERR" )
|
||||||
|
|
||||||
|
? repl( "=", 40 )
|
||||||
|
|
||||||
|
? "running child process with error redirection:", cProg
|
||||||
|
n := hb_processRun( cProg, cSrvData, @cRead, @cError )
|
||||||
|
OutErr( cError )
|
||||||
|
? "result:", n
|
||||||
|
? "READ DONE =>", iif( cRead == cCliData, "OK", "ERR" )
|
||||||
|
|
||||||
|
? repl( "=", 40 )
|
||||||
|
|
||||||
|
? "running child process with mixed redirection:", cProg
|
||||||
|
n := hb_processRun( cProg, cSrvData, @cRead, @cRead )
|
||||||
|
/* divide stdout and stderr lines */
|
||||||
|
cBuffer := cRead
|
||||||
|
cRead := cError := ""
|
||||||
|
for each cBuffer in hb_ATokens( cBuffer, .T. )
|
||||||
|
if " CHILD: " $ cBuffer
|
||||||
|
cError += cBuffer + hb_eol()
|
||||||
|
elseif ! cBuffer == "" .or. ! cBuffer:__enumIsLast()
|
||||||
|
cRead += cBuffer + hb_eol()
|
||||||
|
endif
|
||||||
|
next
|
||||||
|
OutErr( cError )
|
||||||
|
? "result:", n
|
||||||
|
? "READ DONE =>", iif( cRead == cCliData, "OK", "ERR" )
|
||||||
|
|
||||||
|
? repl( "=", 40 )
|
||||||
|
|
||||||
|
cProg := hb_argv( 0 ) + " STDOUT"
|
||||||
|
? "running child process only with stdout redirected:", cProg
|
||||||
|
? "result:", hb_processRun( cProg,, @cRead )
|
||||||
|
? "STDOUT =>"
|
||||||
|
? cRead
|
||||||
|
|
||||||
|
? repl( "=", 40 )
|
||||||
|
|
||||||
|
? "running child process with stdout and stderr redirected:", cProg
|
||||||
|
? "result:", hb_processRun( cProg,, @cRead, @cError )
|
||||||
|
? "STDOUT =>"
|
||||||
|
? cRead
|
||||||
|
? "STDERR =>"
|
||||||
|
? cError
|
||||||
|
|
||||||
|
? repl( "=", 40 )
|
||||||
|
endif
|
||||||
|
return
|
||||||
|
|
||||||
|
static proc msg( ... )
|
||||||
|
local param, cPar, cMsg
|
||||||
|
|
||||||
|
cMsg := hb_tsToStr( hb_dateTime() ) + " " + iif( s_lChild, "CHILD: ", "PARENT:" )
|
||||||
|
for each param in { ... }
|
||||||
|
cPar := hb_CStr( param )
|
||||||
|
cMsg += iif( cPar = ",", "", " " ) + LTrim( cPar )
|
||||||
|
next
|
||||||
|
OutErr( cMsg + hb_eol() )
|
||||||
|
return
|
||||||
Reference in New Issue
Block a user