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

Reply via email to