Process Pipes
Steven Schveighoffer
schveiguy at gmail.com
Thu Oct 11 13:09:33 UTC 2018
On 10/10/18 4:07 AM, Gorker wrote:
> On Wednesday, 10 October 2018 at 08:02:29 UTC, Kagamin wrote:
>> stderr buffer is full (it's about 8kb or so) and gcc waits when you
>> read from it.
>
> Thank you for your kind reply,
>
> How to just try to read from stdout (not blocking), and then try to read
> from stderr (not blocking)?
> I mean, how to check both pipes for data?
Probably you could use OS mechanisms like poll or select. Given your
usage of gcc, I'm assuming you are on some non-Windows system? Those
tools should be available.
Of course, it's hard to write a cross platform way to do this, so I
don't think std.process has ways to check if the pipe has data
asynchronously. Things are complicated by the fact that it wraps the
pipes in FILE * constructs, which means the file descriptor may not
reflect if data is available if it's already in the buffer.
I think the most reasonable way is to use multiple threads to process
the output. It may seem heavy-handed, but I don't know of a better way
given how std.process works.
> As an alternative, how to raise the 8kb limit?
You would have to use the OS mechanisms to do this (e.g.
https://stackoverflow.com/questions/5218741/set-pipe-buffer-size). I
strongly suggest not taking this route, I'm not sure how portable it is
to raise the buffer size after the pipe is in use. Plus, how much do you
raise the limit? What if you compile an even worse C program and get
100k of errors? ;)
-Steve
More information about the Digitalmars-d-learn
mailing list