This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: pipe data form windows program to cygwin program
- From: bertrand marquis <bertrand dot marquis at sysgo dot com>
- To: Bob Byrnes <byrnes at curl dot com>
- Cc: cygwin <cygwin at cygwin dot com>
- Date: 29 Oct 2004 17:40:49 +0200
- Subject: Re: pipe data form windows program to cygwin program
- Organization: SYSGO AG
- References: <20041029021811.7147AE538@carnage.curl.com>
Hi
bob thanks for your help,
i solve the problem bny using only windows functions to have a pipe and
that is working well. It seems that posix and windows doesn't work well
together.
bertrand
Le ven 29/10/2004 Ã 04:18, Bob Byrnes a Ãcrit :
> > | Are you *sure* that you have closed *all* of the write handles to the pipe?
> > | If any write handles remain open, then EOF won't be delivered to the
> > | read side of the pipe.
> >
> > i think i did, but even if i didn't the fact that the program exit
> > normally will close all open handles under windows, won't it ?
>
> It's true that all open handles for the parent process will be closed
> on exit. However, if handles for the write side of the pipe were
> passed to the child process, and any of them remain open, then that's
> a problem. This appears to be the case for your sample program.
>
> Here are some suggestions:
>
> -- If you only need to write out some compressed data, try linking
> with zlib and calling one of the gzip functions: some examples
> are provided with the zlib source distribution. This is simple
> (no pipes or subprocesses), efficient, and effective.
>
> -- If you really do need a pipe to a subprocess, consider using
> popen(), which does all of the work for you.
>
> -- If for some reason you need to do all of the pipe and process
> creation stuff yourself, be sure to close all of the unneeded
> file descriptors in the child process as well as in the parent
> process. The usual technique looks something like this:
>
> int pfds[2]; // pipe file descriptors
>
> pipe(pfds); // make the pipe
>
> if (fork() == 0) {
> // child
>
> // connect stdin to read side of pipe
> dup2(pfds[0], STDIN_FILENO);
>
> // close unneeded pipe descriptors
> close(pfds[0]);
> close(pfds[1]);
>
> execlp("gzip", ...);
> } else {
> // parent
>
> // connect stdout to write side of pipe
> dup2(pfds[1], STDOUT_FILENO);
>
> // close unneeded pipe descriptors
> close(pfds[0]);
> close(pfds[1]);
>
> // write to stdout
> // close stdout, or exit
> }
>
> Alternately, the parent could just write to pfds[1], the write side
> of the pipe, if you don't want or need to mess with stdout. But it's
> still important to close pfds[0], the read side of the pipe, in the
> parent process.
>
> Either way, there are no stray open file descriptors for the pipe
> in any process, so when the parent closes the write side of the pipe,
> the child should see EOF on the read side.
>
> One final suggestion: I'd try to avoid mixing the win32 and posix APIs.
> Life is complicated enough without trying to deal with win32 HANDLEs
> and posix (int) file descriptors at the same time, or using functions
> like DuplicateHandle() and dup2() in the same program.
>
> HTH ...
>
> --
> Bob
>
> --
> Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
> Problem reports: http://cygwin.com/problems.html
> Documentation: http://cygwin.com/docs.html
> FAQ: http://cygwin.com/faq/
>
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/