diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 2000-01-27 19:43:35 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 2000-01-27 19:43:35 +0000 |
commit | 030866aa8d0911636ef2210b710f544fd2c85c8e (patch) | |
tree | 78db3f262afc04ec35b86c1618d43068a5f7851c | |
parent | b181b6fb157975572d5e0c5c46c1594e317a45ba (diff) | |
download | perl-030866aa8d0911636ef2210b710f544fd2c85c8e.tar.gz |
document unimplemented status of forking pipe open() on windows
p4raw-id: //depot/perl@4914
-rw-r--r-- | pod/perlfork.pod | 67 | ||||
-rwxr-xr-x | t/op/fork.t | 47 |
2 files changed, 114 insertions, 0 deletions
diff --git a/pod/perlfork.pod b/pod/perlfork.pod index 6c11b5e662..d930e9396e 100644 --- a/pod/perlfork.pod +++ b/pod/perlfork.pod @@ -172,6 +172,73 @@ the seek position in the parent will change it in the child and vice-versa. One can avoid this by opening files that need distinct seek pointers separately in the child. +=item Forking pipe open() not yet implemented + +The C<open(FOO, "|-")> and C<open(BAR, "-|")> constructs are not yet +implemented. This limitation can be easily worked around in new code +by creating a pipe explicitly. The following example shows how to +write to a forked child: + + # simulate open(FOO, "|-") + sub pipe_to_fork ($) { + my $parent = shift; + pipe my $child, $parent or die; + my $pid = fork(); + die "fork() failed: $!" unless defined $pid; + if ($pid) { + close $child; + } + else { + close $parent; + open(STDIN, "<&=" . fileno($child)) or die; + } + $pid; + } + + if (pipe_to_fork('FOO')) { + # parent + print FOO "pipe_to_fork\n"; + close FOO; + } + else { + # child + while (<STDIN>) { print; } + close STDIN; + exit(0); + } + +And this one reads from the child: + + # simulate open(FOO, "-|") + sub pipe_from_fork ($) { + my $parent = shift; + pipe $parent, my $child or die; + my $pid = fork(); + die "fork() failed: $!" unless defined $pid; + if ($pid) { + close $child; + } + else { + close $parent; + open(STDOUT, ">&=" . fileno($child)) or die; + } + $pid; + } + + if (pipe_from_fork('BAR')) { + # parent + while (<BAR>) { print; } + close BAR; + } + else { + # child + print "pipe_from_fork\n"; + close STDOUT; + exit(0); + } + +Forking pipe open() constructs will be supported in future. + =item Global state maintained by XSUBs External subroutines (XSUBs) that maintain their own global state may diff --git a/t/op/fork.t b/t/op/fork.t index 11efa79d17..f3d74f978f 100755 --- a/t/op/fork.t +++ b/t/op/fork.t @@ -320,3 +320,50 @@ BEGIN { #print "outer\n" EXPECT inner +######## +sub pipe_to_fork ($$) { + my $parent = shift; + my $child = shift; + pipe($child, $parent) or die; + my $pid = fork(); + die "fork() failed: $!" unless defined $pid; + close($pid ? $child : $parent); + $pid; +} + +if (pipe_to_fork('PARENT','CHILD')) { + # parent + print PARENT "pipe_to_fork\n"; + close PARENT; +} +else { + # child + while (<CHILD>) { print; } + close CHILD; + exit; +} + +sub pipe_from_fork ($$) { + my $parent = shift; + my $child = shift; + pipe($parent, $child) or die; + my $pid = fork(); + die "fork() failed: $!" unless defined $pid; + close($pid ? $child : $parent); + $pid; +} + +if (pipe_from_fork('PARENT','CHILD')) { + # parent + while (<PARENT>) { print; } + close PARENT; +} +else { + # child + print CHILD "pipe_from_fork\n"; + close CHILD; + exit; +} +EXPECT +pipe_from_fork +pipe_to_fork |