Non-blocking pipe using popen?

jldupont picture jldupont · Nov 14, 2009 · Viewed 22.7k times · Source

I'd like to open a pipe using popen() and have non-blocking 'read' access to it.

How can I achieve this?

(The examples I found were all blocking/synchronous)

Answer

Matt Joiner picture Matt Joiner · Nov 15, 2009

Setup like this:

FILE *f = popen("./output", "r");
int d = fileno(f);
fcntl(d, F_SETFL, O_NONBLOCK);

Now you can read:

ssize_t r = read(d, buf, count);
if (r == -1 && errno == EAGAIN)
    no data yet
else if (r > 0)
    received data
else
    pipe closed

When you're done, cleanup:

pclose(f);