In what folllows, it's important to realize that pipe redirection occurs before any other redirections specified by a command.
You can redirect stderror into a pipe thusly:
Note, however, that standard output (from the date command) is still going into that pipe as well. If you don't want stdout to go into the pipe, and instead go to whereever stdout was going before the pipe redirection, before executing the eval pipeline, you can save the original, pre-pipe stdout destination in a file descriptor.
Note that the date command's output did not go through sed, but directly to the terminal, in essence, the usual stdout/stderr behavior of a pipe redirection have been flipped.
Also, it's always a good idea to close file descriptors when they're no longer needed (particularly when using an interactive shell or a long-lived shell-script):
Regards,
Alister
Herez the question,
In a process which writes into file FILE1 with descriptor
fHandler1 and it is run as a background process
where would statements be directed
when stderr descriptor is used.
fprintf(stderr,"some message\n");
assume that session from which it is run is terminated and... (3 Replies)
can pipe sychronize thread or process? because I'm trying to create 5 thread or process that can take an integer value and display it. each time a thread display the value, it has to be decrement it by 1 until the value has reach 0. The problem that I'm having is how can that integer value be... (1 Reply)
I have the following code which works on AIX 4.3 but fails at times on AIX 5.3
with:
cat: 0652-054 cannot write to output. There is no process to read data written to a pipe.
validator="${validator_exe} ${validator_parms}"
cmd_line="${CAT} ${data_file} | ${validator}... (6 Replies)
Hi folks :)
Can deamonized process access to stderr, stdout?
I 'm trying to display error_num/return value of a function run() in stderr using
fprintf(stderr, "function run() returns = %d", ret_val);
run() is called after deamonizing the process. (1 Reply)
Hi.. I am hoping someone could assist me with the pipe program I wrote below. I want to have communication from parent to child and then child to parent.. Is my logic right?
int p,p1;
pipe(p);
pipe(p1);
pid_t pid = fork();
if(pid == 0)
{
close(p);
close(p1);
dup2(p,0);... (1 Reply)
Hi Everyone,
The machine I'm working on is an AIX 5.3 LPAR running on a P650. oslevel -r shows 5300-08. I'm trying to take a backup to a SCSI tape drive, which has been working up until this point. I know of nothing that has changed recently to cause this problem. But when I try to take a... (0 Replies)
We use SAP application cluster on AIX. Communication between 2 of its instances is failing randomly with the following error:
java.net.SocketException: There is no process to read data written to a pipe.
The above error causes a cluster restart if an important communication fails.
Can... (0 Replies)
Hi,
I've came across an issue with a script I've been writing to check DHCP addresses on an Solaris system, the script has been running reasonably well, until it hit the following problem:
./sub_mon_v2: redirection error: cannot duplicate fd: Too many open files
./sub_mon_v2: cannot make... (3 Replies)
Dear all,
I use a pipe command to assign a variable:
$ v_LstStdCdhId=$(cat Bteq_Xport_GetLstStdViewToBuild__1274.txt | grep 'CD/39/AT/CDH_BV_ODS'|cut -d"/" -f1)
$ echo "${v_LstStdCdhId}"
43
49
My aim is to concatenate for each line of the variable v_LstStdCdhId the character "/" in... (3 Replies)
Discussion started by: dae
3 Replies
LEARN ABOUT PHP
proc_open
PROC_OPEN(3) 1 PROC_OPEN(3)proc_open - Execute a command and open file pointers for input/output
SYNOPSIS
resource proc_open (string $cmd, array $descriptorspec, array &$pipes, [string $cwd], [array $env], [array $other_options])
DESCRIPTION proc_open(3) is similar to popen(3) but provides a much greater degree of control over the program execution.
PARAMETERS
o $cmd
- The command to execute
o $descriptorspec
- An indexed array where the key represents the descriptor number and the value represents how PHP will pass that descriptor to
the child process. 0 is stdin, 1 is stdout, while 2 is stderr. Each element can be:
oAn array describing the pipe to pass to the process. The first element is the descriptor type and the second element is an
option for the given type. Valid types are
pipe (the second element is either r to pass the read end of the pipe to the process, or w to pass the write end) and file
(the second element is a filename).
o A stream resource representing a real file descriptor (e.g. opened file, a socket,
STDIN).
The file descriptor numbers are not limited to 0, 1 and 2 - you may specify any valid file descriptor number and it will be passed
to the child process. This allows your script to interoperate with other scripts that run as "co-processes". In particular, this is
useful for passing passphrases to programs like PGP, GPG and openssl in a more secure manner. It is also useful for reading status
information provided by those programs on auxiliary file descriptors.
o $pipes
- Will be set to an indexed array of file pointers that correspond to PHP's end of any pipes that are created.
o $cwd
- The initial working dir for the command. This must be an absolute directory path, or NULL if you want to use the default value
(the working dir of the current PHP process)
o $env
- An array with the environment variables for the command that will be run, or NULL to use the same environment as the current PHP
process
o $other_options
- Allows you to specify additional options. Currently supported options include:
o suppress_errors (windows only): suppresses errors generated by this function when it's set to TRUE
o bypass_shell (windows only): bypass cmd.exe shell when set to TRUE
RETURN VALUES
Returns a resource representing the process, which should be freed using proc_close(3) when you are finished with it. On failure returns
FALSE.
CHANGELOG
+--------+---------------------------------------------------+
|Version | |
| | |
| | Description |
| | |
+--------+---------------------------------------------------+
| 5.2.1 | |
| | |
| | Added the bypass_shell option to the |
| | $other_options parameter. |
| | |
+--------+---------------------------------------------------+
EXAMPLES
Example #1
A proc_open(3) example
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);
$cwd = '/tmp';
$env = array('some_option' => 'aeiou');
$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
// Any error output will be appended to /tmp/error-output.txt
fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
echo "command returned $return_value
";
}
?>
The above example will output something similar to:
Array
(
[some_option] => aeiou
[PWD] => /tmp
[SHLVL] => 1
[_] => /usr/local/bin/php
)
command returned 0
NOTES
Note
Windows compatibility: Descriptors beyond 2 (stderr) are made available to the child process as inheritable handles, but since the
Windows architecture does not associate file descriptor numbers with low-level handles, the child process does not (yet) have a
means of accessing those handles. Stdin, stdout and stderr work as expected.
Note
If you only need a uni-directional (one-way) process pipe, use popen(3) instead, as it is much easier to use.
SEE ALSO popen(3), exec(3), system(3), passthru(3), stream_select(3), The backtick operator.
PHP Documentation Group PROC_OPEN(3)