Bug #71804 [Com]: proc_close does not return exit code
Edit report at https://bugs.php.net/bug.php?id=71804&edit=1
ID: 71804
Comment by: as@php.net
Reported by: mark at mpen dot ca
Summary: proc_close does not return exit code
Status: Open
Type: Bug
Package: Program Execution
Operating System: Ubuntu 14.10
PHP Version: 7.0.4
Block user comment: N
Private report: N
New Comment:
I agree it should at least be documented somewhere.
By the way, this doesn't appear to be a new bug. After investigating I found many bugs
reporting the same behavior. Google query: site:bugs.php.net "proc_close"
"--enable-sigchild"
You should file a bug with the maintainer of the PHP 7 package you used. They should recompile
without --enable-sigchild.
Previous Comments:
------------------------------------------------------------------------
[2016-03-21 16:20:20] mark at mpen dot ca
Thank you for investigating, disabling sigchild fixed it for me. I don't *think* I need
sigchild anymore (I'm not entirely sure what it does), so this should be fine for me, but
something should probably be done about this to warn others because it looks like a breaking change.
------------------------------------------------------------------------
[2016-03-20 05:43:01] as@php.net
In the PHP 7 trace, I noticed that the parent process is setting a signal handler for SIGCHLD.
(Search for "rt_sigaction(SIGCHLD".) Searching backwards from there, I was able to
reproduce the bug by recompiling with --enable-sigchild (already present in your
binary). This switch is from 15+ years ago (commit 674f4bac) and causes PHP to reap all child
processes asynchronously:
https://github.com/php/php-src/blob/PHP-7.0.4/main/main.c#L1515-L1523
proc_close also attempts to reap the child process here:
https://github.com/php/php-src/blob/PHP-7.0.4/ext/standard/proc_open.c#L228
but at that point it has already been reaped by sigchld_handler so waitpid
returns -1.
The only way I can think of fixing this is to keep track of exit statuses in
sigchld_handler and check that in proc_close if PHP_SIGCHILD
is defined. Very ugly.
Alternatively we might be able to deprecate --enable-sigchild.
For your specific case, you likely do not need --enable-sigchild, and recompiling
without it should fix your issue.
------------------------------------------------------------------------
[2016-03-17 16:12:46] mark at mpen dot ca
Not sure how to attach files; it wouldn't let me submit them as patches. I've uploaded
them to pastebin:
- PHP 5.6 strace: http://pastebin.com/SNuJGAZW
- PHp 7.0.4 strace: http://pastebin.com/akrFjzpT
------------------------------------------------------------------------
[2016-03-15 04:22:56] as@php.net
Having trouble reproducing. Can you attach strace output for 5.6 and 7? Invoke like:
$ strace -ttt -T -f -s1024 -o strace.log php test.php
Thanks.
------------------------------------------------------------------------
[2016-03-11 19:00:30] mark at mpen dot ca
Description:
------------
proc_close always return exit code -1 on PHP 7 when it should be 0 (as it does on PHP 5.6).
$ php7 --version
PHP 7.0.4 (cli) (built: Mar 11 2016 10:54:16) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
Compiled with:
./configure --with-openssl --with-layout=GNU --with-pear --enable-ftp --with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd --enable-session --enable-libxml --enable-xml --with-zlib=yes
--enable-mbstring=all --with-gettext --with-pspell --with-gd --enable-gd-native-ttf
--with-freetype-dir=/usr/local/lib/ --with-jpeg-dir=/usr/local/lib/ --enable-sockets --enable-pcntl
--enable-sigchild --with-mcrypt=/usr/local/lib --enable-posix --enable-dom --enable-simplexml
--with-readline --enable-bcmath
Test script:
---------------
<?php
$proc = proc_open("pwd",[1=>['pipe','w']], $pipes);
var_dump(stream_get_contents($pipes[1]));
fclose($pipes[1]);
var_dump(proc_close($proc));
Expected result:
----------------
Exit code 0
Actual result:
--------------
Exit code -1
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=71804&edit=1
Thread (7 messages)