我使用NDK为android构建PHP。到目前为止测试的大多数函数都能完美运行,除了。。。
所有与exec相关的php函数(如exec、shell_exec、popen等)都是sefgault。
php示例代码(test.php)
<?php
$s=shell_exec("ls");
echo $s
?>
结果:
# php test.php
[1] Segmentation fault
我在内部shell_exec函数中添加了一些调试代码
PHP_FUNCTION(shell_exec)
{
FILE *in;
size_t total_readbytes;
zval **cmd;
char *ret;
php_stream *stream;
if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &cmd)==FAILURE) {
WRONG_PARAM_COUNT;
}
if (PG(safe_mode)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot execute using backquotes in Safe Mode");
RETURN_FALSE;
}
convert_to_string_ex(cmd);
#ifdef PHP_WIN32
if ((in=VCWD_POPEN(Z_STRVAL_PP(cmd), "rt"))==NULL) {
#else
if ((in=VCWD_POPEN(Z_STRVAL_PP(cmd), "r"))==NULL) {
#endif
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to execute '%s'", Z_STRVAL_PP(cmd));
RETURN_FALSE;
}
stream = php_stream_fopen_from_pipe(in, "rb");
total_readbytes = php_stream_copy_to_mem(stream, &ret, PHP_STREAM_COPY_ALL, 0);
php_stream_close(stream);
printf("TEST'n%s'n",ret);
if (total_readbytes > 0) {
RETURN_STRINGL(ret, total_readbytes, 0);
} else {
RETURN_NULL();
}
}
结果
# php test.php
TEST
test.php
[1] Segmentation fault
我总结
-ls的执行官工作得很好
-ls的结果是正常的
还是出了问题。
问题1:
有人能给我指一下执行PHP_FUNCTION(shell_exec)的代码部分吗?这样我就可以尝试查看哪里出错的更多细节
问题2:
任何可能出错的提示。
版本信息
安卓2.3.1
安卓NDK 6
PHP 5.2.17
感谢匿名者,他们给我发了一封包含有用提示的电子邮件。
事实证明,php将popen用于所有与exec相关的代码。一些人可能知道机器人仿生版的popen在ICS之前是很有缺陷的,而且它知道堆栈损坏了。
我修改了php以使用popen的修改版本现在php exec/shell_exec等都运行得没有任何问题