Popen and EVFILT_WRITE question
des at des.no
Sun Mar 30 20:49:35 PDT 2008
Mel <fbsd.hackers at rachie.is-a-geek.net> writes:
> from reading the manpage on EVFILT_WRITE I thought it would be an easy to use
> interface to detect when a program wants input.
> So far, that doesn't seem to be the case. Ultimately what I want to do is pipe
> all the popen(3)'d output to a logfile and act on any input it wants.
> Could anyone explain to me why I'm never getting the EVFILT_WRITE event in
> below testcode?
> (It doesn't matter if I open the pipe with w+ or r+).
> #include <sys/types.h>
> #include <sys/event.h>
> #include <sys/time.h>
> #include <sysexits.h>
> #include <err.h>
> #include <stdio.h>
> int main(int argc, char **argv)
> FILE *proc;
> int kq;
> struct kevent changes, events;
> proc = popen("./test.sh", "w+");
> if( -1 == (kq = kqueue()) )
> err(EX_OSERR, "Cannot get a kqueue");
> EV_SET(&changes, fileno(proc), EVFILT_WRITE, EV_ADD|EV_ENABLE, 0,
> 0, 0);
> EV_SET(&changes, fileno(proc), EVFILT_READ, EV_ADD|EV_ENABLE, 0,
> 0, 0);
This is never going to work.
First, the second kevent overrides the first, because they both have the
Second, you're going to run into buffering issues.
Third, an EVFILT_WRITE event will trigger as long as there is space in
the pipe buffer. There is no such thing as "when a program wants input"
in Unix; it will either read input or it won't, and what happens when it
reads depends entirely on what the fd it reads from is connected to,
whether it's a slow or fast device, blocking or non-blocking, etc.
Dag-Erling Smørgrav - des at des.no
More information about the freebsd-hackers