Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #164206
| From | Kaz Kylheku <480-992-1380@kylheku.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: pipe a buffer to a program's stdin using popen |
| Date | 2022-01-01 19:51 +0000 |
| Organization | A noiseless patient Spider |
| Message-ID | <20220101101839.914@kylheku.com> (permalink) |
| References | <sqp79k$po6$1@reader1.panix.com> |
On 2022-01-01, John Forkosh <forkosh@panix.com> wrote:
> Suppose I have a program that, in part, runs another program
> using FILE *outptr=popen("some command string","r") and then
> fread()'s its stdout from outptr. Now, if that other program
> is otherpgm which reads input from its stdin, and I also want
> that input to come from a file inputfile, then I could easily
> just write FILE *outptr=popen("cat inputfile|otherpgm","r");
That would be a useless use of cat; it could be done with:
FILE *outptr=popen("otherpgm < inputfile","r");
>
> But here's the rub: rather than some inputfile on disk, my
> program has an internal unsigned char buffer[9999] which is
> what I want piped to otherpgm, but which I don't want written
> to disk first. How can I get buffer piped to otherpgm's stdin
> using popen()? Or some other mechanism, as long as I can read
> otherpgm's stdout from within my program.
A program to which you send input while reading its output
is a coprocess. The popen function is for simple uses; it doesn't
support coprocesses. You have to cob those together yourself
with fork, exec, and various other functions.
With a coprocess, there is the risk of deadlock. It happens
like this: you write output for the process to read, while
it concurrently reads it and processes output. Because you're
writing, you're not reading. The process blocks trying to
write the data to you, and therefore stops reading. Since it
stops reading, you block writing to it.
In the general case, coprocesses require non-blocking I/O,
polling for input and output simultaneously, or else threads.
When the amount of data exchanged is small (so small that you can you
can rely on it all fitting into the pipe size on the given system)
deadlock may be avoided that way.
In the case of just wanting to feed a canned piece of data to
the process from memory, while reading its output, we can use
fork() to create a process which will do the feeding. We let
that run in the background. (Thus we have a multi-threaded solution via
multi-process, and do not need to juggle non-blocking I/O and polling.)
Just like in your original popen above, you have a "cat inputfile |
otherpgm" where cat is useless, a forked process is instantiated which
"cats" the memory buffer. That "memory cat" is not useless because a
piece of memory will not serve itself as a file.
--
TXR Programming Language: http://nongnu.org/txr
Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
pipe a buffer to a program's stdin using popen John Forkosh <forkosh@panix.com> - 2022-01-01 09:35 +0000
Re: pipe a buffer to a program's stdin using popen Mark Bluemel <mark.bluemel@gmail.com> - 2022-01-01 03:22 -0800
Re: pipe a buffer to a program's stdin using popen Meredith Montgomery <mmontgomery@levado.to> - 2022-01-01 11:21 -0300
Re: pipe a buffer to a program's stdin using popen John Forkosh <forkosh@panix.com> - 2022-01-02 09:34 +0000
Re: pipe a buffer to a program's stdin using popen Kaz Kylheku <480-992-1380@kylheku.com> - 2022-01-01 19:51 +0000
Re: pipe a buffer to a program's stdin using popen gazelle@shell.xmission.com (Kenny McCormack) - 2022-01-01 21:00 +0000
Re: pipe a buffer to a program's stdin using popen John Forkosh <forkosh@panix.com> - 2022-01-02 09:12 +0000
Re: pipe a buffer to a program's stdin using popen John Forkosh <forkosh@panix.com> - 2022-01-02 09:30 +0000
Re: pipe a buffer to a program's stdin using popen Kaz Kylheku <480-992-1380@kylheku.com> - 2022-01-03 00:03 +0000
Re: pipe a buffer to a program's stdin using popen John Forkosh <forkosh@panix.com> - 2022-01-03 08:07 +0000
Re: pipe a buffer to a program's stdin using popen Manfred <noname@add.invalid> - 2022-01-03 22:54 +0100
Re: pipe a buffer to a program's stdin using popen Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-01-01 15:00 -0800
Re: pipe a buffer to a program's stdin using popen gazelle@shell.xmission.com (Kenny McCormack) - 2022-01-02 00:01 +0000
Re: pipe a buffer to a program's stdin using popen Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2022-01-02 12:54 +0000
Re: pipe a buffer to a program's stdin using popen gazelle@shell.xmission.com (Kenny McCormack) - 2022-01-02 14:54 +0000
Re: pipe a buffer to a program's stdin using popen Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2022-01-02 15:37 +0000
Re: pipe a buffer to a program's stdin using popen John Forkosh <forkosh@panix.com> - 2022-01-02 18:00 +0000
Re: pipe a buffer to a program's stdin using popen gazelle@shell.xmission.com (Kenny McCormack) - 2022-01-02 18:03 +0000
Re: pipe a buffer to a program's stdin using popen John Forkosh <forkosh@panix.com> - 2022-01-02 17:51 +0000
csiph-web