I am glad that you have your code working but I am confused. What does the current values of STDIN, STDOUT and STDOUT have to with opening a pipe or the pipe system call in general?
If I run this code, it works exactly as expected, i.e. there is a file /tmp/err, containing the output of the ps command.
I realise that the original code had re-opened STDERR to the apache error log.#!/usr/bin/perl # vim: sw=4 use strict; use warnings; close STDIN; close STDOUT; close STDERR; open STDIN, "</dev/null"; open STDOUT, ">/dev/null"; open STDERR, ">/dev/null"; open my $pipe, "ps aux |" or die "pipe failed:$!\n"; open my $err, ">", "/tmp/err" or die "couldn't open /tmp/err :$!\n"; while (<$pipe>) { print $err $_; } close $err;
To answer the question regarding the need to close STDIN, STDOUT and STDERR. This usually done when you want to create a daemon or process that is intended to run in the background. I have never seen someone do it in the parent before. Normally it is done in the child so that the child will be owned by init etc.
Here is a URL for a bit more info on writing a daemon in Perl if you are curious.
In reply to Re^2: Closing STDIO Caused Pipe Not To Work
by bruceb3
in thread Closing STDIO Caused Pipe Not To Work
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |