#39651 [Ver->Asn]: proc_open() descriptor spec for STDOUT append starts writing from beginning

From: Date: Wed, 05 Sep 2007 13:53:35 +0000
Subject: #39651 [Ver->Asn]: 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-117175@lists.php.net to get a copy of this message
ID: 39651 Updated by: jani@php.net Reported By: rherror404 at gmail dot com -Status: Verified +Status: Assigned Bug Type: Program Execution Operating System: win32 only -PHP Version: * +PHP Version: 5? 4? 6? -Assigned To: +Assigned To: nlopess New Comment: Nuno, please check the version field here. It must never be '*' like it was before I set it to something meaningful. If you can reproduce this with PHP 5.2.4, set the version to it. 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

« previous php.bugs (#117175) next »