This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: fork() + file descriptor bug in 1.7.27(0.271/5/3) 2013-12-09 11:54


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

Attachment: pgpP4ODiGx7vw.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]