#39651 [Com]: proc_open() descriptor spec for STDOUT append starts writing from beginning
| From: | sharlissa_newton at yahoomail dot com | Date: | Tue, 24 Apr 2007 20:58:25 +0000 |
| Subject: | #39651 [Com]: proc_open() descriptor spec for STDOUT append starts writing from beginning | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-111867@lists.php.net to get a copy of this message | ||
ID: 39651
Comment by: sharlissa_newton at yahoomail dot com
Reported By: rherror404 at gmail dot com
Status: Verified
Bug Type: Program Execution
Operating System: Windows
PHP Version: *
New Comment:
hay do you now what kind of bugs start with the letter "J"
Previous Comments:
------------------------------------------------------------------------
[2007-01-01 15:25:19] nlopess@php.net
I do verify the bug, but I wasn't able to fix it.
The problem is that I think windows doesn't support the append mode
when using HANDLEs. So, when we call _get_osfhandle() to convert the fd
to an HANDLE, windows loose this information. (yes, we need to convert
to an handle because CreateProcess() requires it).
I'm leacing open as someone might have some idea (no, I don't know how
to emulate it, as after "forking" we loose the control over the new
process..)
------------------------------------------------------------------------
[2006-11-27 23:09:11] tony2001@php.net
Not reproducible on Linux.
------------------------------------------------------------------------
[2006-11-27 22:49:38] rherror404 at gmail dot com
Description:
------------
Defining the descriptor spec for STDOUT for a call to proc_open() to
append to a file instead starts writing from beginning (not at the end
as one would expect).
C:\WINDOWS\Temp>php launch1.php
Reproduce code:
---------------
C:\WINDOWS\Temp>type launch1.php
<?
$dspec = array(0 => array("pipe", "r")
, 1 => array("file", 'C:\WINDOWS\TEMP\launch_stdout.txt', "a")
, 2 => array("file", 'C:\WINDOWS\TEMP\launch_stderr.txt', "a")
);
$i = 5; $inputpackage = serialize($i);
$proc = proc_open('php C:\WINDOWS\TEMP\launch2.php', $dspec, $pipes);
if ( is_resource($proc) ) {fwrite($pipes[0], $inputpackage);
fclose($pipes[0]);
proc_close($proc);}
$i = 2; $inputpackage = serialize($i);
$proc = proc_open('php C:\WINDOWS\TEMP\launch2.php', $dspec, $pipes);
if ( is_resource($proc) ) {fwrite($pipes[0], $inputpackage);
fclose($pipes[0]);
proc_close($proc);}
exit();
?>
C:\WINDOWS\Temp>type launch2.php
<?
function tostdout( $x ) {echo date('[Y-m-d H:i:s (T P)]') . " <PID " .
getmypid(
) . "> $x\r\n";}
$inbuffer = fgets(STDIN, 8192);
$i = unserialize($inbuffer);
for ( $j = 0; $j < $i; $j++ ) {tostdout("$j : $i"); sleep(1);}
exit();
?>
C:\WINDOWS\Temp>
Expected result:
----------------
C:\WINDOWS\Temp>type launch_stdout.txt
[2006-11-27 16:33:53 (CST -06:00)] <PID 4492> 0 : 5
[2006-11-27 16:33:54 (CST -06:00)] <PID 4492> 1 : 5
[2006-11-27 16:33:55 (CST -06:00)] <PID 4492> 2 : 5
[2006-11-27 16:33:56 (CST -06:00)] <PID 4492> 3 : 5
[2006-11-27 16:33:57 (CST -06:00)] <PID 4492> 4 : 5
[2006-11-27 16:33:58 (CST -06:00)] <PID 6808> 0 : 2
[2006-11-27 16:33:59 (CST -06:00)] <PID 6808> 1 : 2
/*
I would expect the second process to append its output
to (the end of) the output of the first process.
*/
Actual result:
--------------
C:\WINDOWS\Temp>type launch_stdout.txt
[2006-11-27 16:33:58 (CST -06:00)] <PID 6808> 0 : 2
[2006-11-27 16:33:59 (CST -06:00)] <PID 6808> 1 : 2
[2006-11-27 16:33:55 (CST -06:00)] <PID 4492> 2 : 5
[2006-11-27 16:33:56 (CST -06:00)] <PID 4492> 3 : 5
[2006-11-27 16:33:57 (CST -06:00)] <PID 4492> 4 : 5
/*
The second process has over-written lines one and two
of the output of the first process.
*/
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=39651&edit=1