readall or readbytes The number of bytes that can be read without a syscall (nb_available) is not a good test of how much can be gotten from a syscall. However, after eof returns true, then nb_available is the upper bound on the data that can be read.
On Tuesday, June 3, 2014, Bob Nnamtrop <[email protected]> wrote: > OK, but I still cannot seem to find out if there is output available. Try: > > julia> function test_redirect(f::Function) > stdout_orig = STDOUT > rd, wr = redirect_stdout() > f() > close(wr) > nb = nb_available(rd) > redirect_stdout(stdout_orig) > nb > end > test_redirect (generic function with 1 method) > > julia> println(test_redirect(()->println("Some output"))) > 0 > > julia> println(test_redirect(()->run(`echo Some output`))) > 0 > > julia> println(test_redirect(()->nothing)) > 0 > > So whether there is anything there or not nb_available returns 0? > > What do you recommend instead of readavailable? > Bob > > > On Tue, Jun 3, 2014 at 9:00 AM, Jameson Nash <[email protected] > <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: > >> You need to close the pipe you called stdin before trying to read from >> stdout. Otherwise, the answers you get are correct -- readavailable can >> return whatever it wants. It is not know if all data written to the pipe is >> available until the write end is closed, and the read end sees an eof >> >> readavailable is a badly defined function. Don't use it. >> >> eof needs to block if there is no data available since it can't answer >> that question until the stream is closed (eof) or there is more data (!eof) >> >> >> >> On Tuesday, June 3, 2014, Bob Nnamtrop <[email protected] >> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >> >>> I am having an issue detecting if STDOUT is empty after I redirect it. >>> I'm using an external C program may or may not write to STDOUT. Thus, I >>> need to know if there is anything there before I readavailable from it >>> (since readavailable blocks if the pipe is empty). Here is some code to >>> show the issue (I redirect STDOUT and send nothing to it and try to check >>> if there is anything there): >>> >>> julia> stdout_orig = STDOUT >>> TTY(open, 0 bytes waiting) >>> >>> julia> stdout, stdin = redirect_stdout() >>> (Pipe(open, 0 bytes waiting),Pipe(open, 0 bytes waiting)) >>> >>> julia> if !eof(stdout) >>> out = readavailable(stdout) >>> end >>> >>> This last command blocks on eof(stdout), which makes it worthless for >>> this purpose. Is it suppose to block when there is nothing in the Pipe? The >>> help for eof says "If the stream is not yet exhausted, this function will >>> block to wait for more data if necessary, and then return "false". " I'm >>> not sure how to interpret this. The behavior of eof seems like a bug to me. >>> >>> So looking at the docs I figure I can use nb_available instead but it >>> doesn't seem to be reliable when the pipe is used by external programs. For >>> example (restarting julia): >>> >>> julia> stdout, stdin = redirect_stdout() >>> (Pipe(open, 0 bytes waiting),Pipe(open, 0 bytes waiting)) >>> >>> julia> stdout, stdin = redirect_stdout() >>> (Pipe(open, 0 bytes waiting),Pipe(open, 0 bytes waiting)) >>> >>> julia> run(`echo Some output`) >>> >>> julia> nb_available(stdout) >>> 0 >>> >>> This should have returned 12. Adding flush_cstdio() doesn't help. >>> nb_available seems to work if you use julia programs to write to STDOUT but >>> not for external programs. Is this a bug? >>> >>> Am I missing something? >>> >>> Thanks, >>> Bob >>> >>> ps Here is my version: >>> >>> julia> versioninfo() >>> Julia Version 0.3.0-prerelease+3407 >>> Commit 152b3d3 (2014-06-02 21:29 UTC) >>> Platform Info: >>> System: Darwin (x86_64-apple-darwin13.2.0) >>> CPU: Intel(R) Core(TM)2 Duo CPU T9550 @ 2.66GHz >>> WORD_SIZE: 64 >>> BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY) >>> LAPACK: libopenblas >>> LIBM: libopenlibm >>> >>> >>> >
