develooper Front page | perl.perl5.porters | Postings from April 2012

[perl #10024] Problems with fork() in perl-5.6.1 on Solaris 2.6.1

Thread Previous
From:
Brian Fraser via RT
Date:
April 28, 2012 01:29
Subject:
[perl #10024] Problems with fork() in perl-5.6.1 on Solaris 2.6.1
Message ID:
rt-3.6.HEAD-4610-1335533107-556.10024-15-0@perl.org
On Wed Jul 03 07:39:57 2002, RT_System wrote:
> On Wed, Jul 03, 2002 at 01:54:21PM -0700, Eric Borduas wrote:
> > The script that follows, creates some strange output. Looking at the
> > output, is appears that the value of $i is being reset in the parent
> > process after each fork (see STDOUT and STDERR below).
> 
> What is more likely happening is that the buffer associated with
> STDOUT
> is being output by by both parent and child processes, resulting in
> duplicate output. From "perldoc -f fork":
> 
>        Beginning with v5.6.0, Perl will attempt to flush all files
> opened
>        for output before forking the child process, but this may not
> be
>        supported on some platforms (see the perlport manpage).  To be
>        safe, you may need to set `$|' ($AUTOFLUSH in English) or call
> the
>        `autoflush()' method of `IO::Handle' on any open handles in
> order
>        to avoid duplicate output.
> 
> Try this and see if the problem goes away!
> 
> Dave.
> 
> > Also, if a foreach loop (e.g. foreach  my $x (@data) ) or a while
> with a shift operator is used,
> > the same problem occurs identical output.
> >
> > We've tested the same program using perl 5.6 with the same results.
> However, run tested under linux the
> > problem is not encountered.
> >
> > TEST SCRIPT:
> >
> > package main;
> >
> >   use strict;
> >
> >   my @data =
> >     (
> >     'S000040014	5',
> >     'S000040020	7'
> >     );
> >
> >   print STDERR "Parent $$\n";
> >   my $end = scalar(@data);
> >   my $i = 0;
> >   for( ; $i < $end; ) {
> >   	my $pid = fork();
> >     print $i, "\n";
> >     if ( $pid == 0 )
> >       {
> >       print STDERR "Child $i exiting\n";
> >       close(STDOUT);
> >   	  exit 0;
> >       }
> >      ++$i;
> >   }
> >
> > __END__
> >
> >
> > STDOUT:
> >
> > 0
> > 0
> > 1
> > 0
> > 1
> >
> > STDERR:
> >
> > Parent 22716
> > Child 0 exiting
> > Child 1 exiting
> 

Running this with and without flushing on Perls 5.8.4, 5.12.4, 5.14.2,
and blead, I get:

hugmeir@global:~/perl-blead$ perl 10024.pl
Parent 12004
0
0
Child 0 exiting
1
1
Child 1 exiting
hugmeir@global:~/perl-blead$ perl 10024-flush.pl
Parent 12007
0
0
Child 0 exiting
1
1
Child 1 exiting

So I vote we mark this as resolved.


---
via perlbug:  queue: perl5 status: stalled
https://rt.perl.org:443/rt3/Ticket/Display.html?id=10024

Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About