fork() + file descriptor bug in 1.7.27(0.271/5/3) 2013-12-09 11:54
Corinna Vinschen
corinna-cygwin@cygwin.com
Wed Jan 15 16:50:00 GMT 2014
On Jan 15 11:39, Tom Honermann wrote:
> On 01/13/2014 11:06 AM, tednolan@bellsouth.net wrote:
> ...
> > switch (fork()) {
> >
> > /* error */
> > case -1:
> ...
> > /* child */
> > case 0:
> > fprintf(stderr, "child\n"); fflush(stderr);
> > exit(0);
> > break;
>
> The above code is incorrect. It is always wrong to call exit() from
> a forked process that has not yet called one of the exec() family of
> functions. _exit() should be called instead. Best case, calling
> exit() will result in double flushing of any stream buffers held by
> the parent at the time fork() is called (since the buffers will
> (eventually) be flushed by the parent as well as the child (unless
> at least one of the processes aborts or exits with _exit()).
Still, SUSv4 says:
The exit() function shall then flush all open streams with unwritten
buffered data and close all open streams. Finally, the process shall
be terminated [...]
Note that exit only flushes streams with *unwritten* data, but not
streams with *unread* data. So this testcase is still valid and
should work.
Corinna
--
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Maintainer cygwin AT cygwin DOT com
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20140115/362e9a45/attachment.sig>
More information about the Cygwin
mailing list