#34794 [Com]: proc_close() hangs when used with two processes
| From: | jdolecek at NetBSD dot org | Date: | Sun, 28 May 2006 17:32:38 +0000 |
| Subject: | #34794 [Com]: proc_close() hangs when used with two processes | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-97702@lists.php.net to get a copy of this message | ||
ID: 34794
Comment by: jdolecek at NetBSD dot org
Reported By: e-t172 at e-t172 dot net
Status: Assigned
Bug Type: Program Execution
Operating System: Linux
PHP Version: 5CVS-2005-10-09 (snap)
Assigned To: wez
New Comment:
This is actually not a bug, or just documentation bug.
proc_close() blocks if the child has not terminated yet.
You must use proc_terminate() instead of proc_close() if you can't
guarantee the child has already exited, or use proc_get_status() to
check if the child has already exited if you want to avoid blocking.
Previous Comments:
------------------------------------------------------------------------
[2006-04-29 02:42:16] Dallas at ekkySoftware dot com
I have a similar problem, it seems at I can't concurrently call the
same page with proc_open until the first proc_open returns. It looks
like proc_open is running through a critical section even though it is
opening separate processes.
From experience it is like php is using the same pipes for each
proc_open and can't continue to the next proc_open until the original
as ended. I would normally use temporary files instead of pipes but
this makes life difficult.
Dallas
http://www.ekkySoftware.com/
------------------------------------------------------------------------
[2006-04-26 14:50:23] radu dot rendec at ines dot ro
Same problem with 5.1.3RC4-dev (latest CVS snapshot at the moment) on
Linux/i386.
I independently reproduced the bug with the following piece of code:
error_reporting(E_ALL);
$spec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$p1 = proc_open("/bin/cat", $spec, $fd1);
$p2 = proc_open("/bin/cat", $spec, $fd2);
fclose($fd1[0]);
fclose($fd1[1]);
fclose($fd1[2]);
echo "closing p1... "; flush();
proc_close($p1);
echo "success\n"; flush();
This code hangs in proc_close(). This doesn't happen if the second
proc_open() is commented.
Although the parent process seems to correctly close all pipes, the
child process still remains blocked in read(0,...).
------------------------------------------------------------------------
[2005-11-01 11:54:27] sniper@php.net
Assigned to the author of this stuff.
------------------------------------------------------------------------
[2005-10-09 20:12:09] e-t172 at e-t172 dot net
Same problem with the last CVS Snapshot.
------------------------------------------------------------------------
[2005-10-09 18:23:40] e-t172 at e-t172 dot net
Description:
------------
(i am french, sorry for my bad english)
1. Open two processes with proc_open()
2. Try to close them : it works only if you close the second one first,
otherwise it hangs
Reproduce code:
---------------
<?php
echo('Opening process 1'."\n");
$process1 = proc_open('cat', array(0 => array('pipe', 'r'), 1 =>
array('pipe', 'r')), $pipes1);
echo('Opening process 2'."\n");
$process2 = proc_open('cat', array(0 => array('pipe', 'r'), 1 =>
array('pipe', 'r')), $pipes2);
// WORKS :
//echo('Closing process 2'."\n");
//fclose($pipes2[0]); fclose($pipes2[1]); proc_close($process2);
//echo('Closing process 1'."\n");
//fclose($pipes1[0]); fclose($pipes1[1]); proc_close($process1);
// DOESN'T WORK :
echo('Closing process 1'."\n");
fclose($pipes1[0]); fclose($pipes1[1]); proc_close($process1);
echo('Closing process 2'."\n");
fclose($pipes2[0]); fclose($pipes2[1]); proc_close($process2);
?>
Expected result:
----------------
$ php -f test.php
Opening process 1
Opening process 2
Closing process 1
Closing process 2
$
Actual result:
--------------
$ php -f test.php
Opening process 1
Opening process 2
Closing process 1
(HANGS)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=34794&edit=1