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:
Przemysław Czerpak
2016-04-07 18:48:44 +02:00
parent 2f1bf5ee72
commit aedce5da71
2 changed files with 199 additions and 0 deletions

View File

@@ -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
View 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