PHP exec不会在特定程序上返回字符串

PHP exec不会在特定程序上返回字符串,php,c,Php,C,如果在shell中执行此命令,则可以看到返回字符串。但是,exec()没有返回任何内容。我还尝试了shell\u exec(),但没有成功。php.ini中的安全模式已关闭。可执行文件的权限为rwxr-x-r-x。我试过使用完整路径和短路径。我可以毫无问题地执行ls,它返回适当的数据,但由于某种原因,我无法从我编写的这个c程序中获得输出。它使用printf()函数打印到stdout,然后再次打印到命令行而不会出现问题,但php不会选择它。有什么好处 $string\u数组 exec(“/bin/

如果在shell中执行此命令,则可以看到返回字符串。但是,
exec()
没有返回任何内容。我还尝试了
shell\u exec()
,但没有成功。php.ini中的安全模式已关闭。可执行文件的权限为
rwxr-x-r-x
。我试过使用完整路径和短路径。我可以毫无问题地执行
ls
,它返回适当的数据,但由于某种原因,我无法从我编写的这个c程序中获得输出。它使用
printf()
函数打印到
stdout
,然后再次打印到命令行而不会出现问题,但php不会选择它。有什么好处

$string\u数组
exec(“/bin/weight”,$string\u数组)
变量转储($string\u数组)

“/bin/weight”
替换为
“/bin/ls”
将显示正确的结果。当我在shell中执行
“/bin/weight”
时,它会按预期打印
{motion=false,weight=0,uom=“LBS”}
,但不知怎的,它无法打印到php。同样,在
php.ini
中,
safe_mode=Off
。把我的头发拔出来

c程序的重要部分:

//build return string and send back to stdout
char weight_buf[32];
char result[1024]="{motion=";

if(motion==FALSE) {
        strcat(result, "false,");
} else {
        strcat(result, "true,");
}
strcat(result, "weight=");
if(negative==TRUE) {
        strcat(result, "-");
}
//itoa(weight, weight_buf, 10);
sprintf(result, "%s%d", result, weight);
strcat(result, weight_buf);
strcat(result, ",uom=\"");
strcat(result, "LBS");  //TODO: fill in the actual units here
strcat(result, "\"}");
printf("%s\n", result);

return 0;
当从以下命令行执行时,上述代码可以打印到标准输出:

如果return_var参数与output参数一起出现, 然后,已执行命令的返回状态将写入 变数

为了打印标准输出,您需要的是或


为了澄清,您可以将一个变量传递到exec()中,exec()将接收所有输出,但此函数不会返回该变量,只返回脚本的返回代码。

关于问题标题,这只是某些程序的问题

这种行为可以通过向stderr而不是stdout写入程序来解释。为此,您需要将stderr重定向到stdout:

exec("/bin/weight 2>&1",$string_array);

我想我已经弄明白了。这个c程序打开一个串行端口,php似乎无法打开它。这可能是串行端口上的权限问题,但也可能是其他问题。违规代码如下:

int fd;
char buf[14];
int res=0;

//printf("opening port...%s", "\n");
fd=open("/dev/pts/0", O_RDWR|O_NOCTTY);

if(fd==-1) {
        //printf("unable to open serial port%s", "\n");
        return -2;
} else {
        //port was successfully opened, set termios vars
        ...
我可以通过向
exec()
命令添加
return\u var
参数来解决这个问题,如下所示:

$string_array;
exec("/bin/weight",$string_array,$return_code);
var_dump($string_array);
print($return_code);
'254'
(基本上是
-2
)被返回,这意味着端口无法打开。感谢所有试图帮助这件事的人


只需将
/dev/pts/0
上的权限更改为
666
即可解决此问题。

从php运行c程序时,您的代码是什么样子的(c和php)?让它写入一个文件或其他东西,并确保它实际输出了您所期望的内容。还要看看PHP错误:
错误报告(E_ALL);ini设置(“显示错误”,1)更新为更多代码和正确格式。字符串执行(字符串$command[,数组和$output[,int和$return\u var])如果存在输出参数,则指定的数组将由命令的每一行输出填充。此数组中不包括尾随空白,例如\n。注意,如果数组已经包含一些元素,exec()将附加到数组的末尾。如果不希望函数附加元素,请在将数组传递给exec()之前调用unset()。我猜这只是将
stdout
stderr
打印到
stdout
?不过,不要掷骰子。数组仍然为空:(@moonlightcheese您的PHP错误日志中有什么内容吗?您是否手动运行PHP脚本,或者只是通过浏览器运行(这可能是与文件权限相关的安全问题,因此
ls-l/bin/weight
会更好)这似乎是权限问题,但不是程序本身的问题。程序打开了一个串行端口,但在打开时似乎失败了。我想我必须为该
/dev
条目或其他内容授予apache/php权限。我可能会发布另一个有关apache/php访问权限的问题。