如果我在shell中执行此命令,我可以看到返回字符串。但是,exec()
没有返回任何内容。我也试过shell_exec()
无济于事。安全模式在php.ini中关闭。可执行文件的权限是rwxr-x-r-x
。我尝试过使用完整路径和短路径。我可以毫无问题地执行ls
,它会返回相应的数据,但我无法从这个c程序获得我出于某种原因编写的输出。它使用stdout
函数打印到printf()
,再次打印到命令行没有问题,但php不会接收它。什么给了?
$string_array;
exec("/bin/weight",$string_array);
var_dump($string_array);
将"/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;
从命令行执行时,上面的代码打印到stdout
就好了:
答案 0 :(得分:1)
如果return_var参数与输出参数一起出现, 然后执行命令的返回状态将写入此 变量
为了打印标准输出,您要找的是system()或passthru()
为了澄清,你可以将一个变量传递给将接收所有输出的exec(),但是这个函数不返回它,只返回脚本的返回码。
答案 1 :(得分:1)
通过问题标题,这对某些程序来说只是一个问题。
这种行为可以通过写入stderr而不是stdout的程序来解释。为了满足这个需要,您需要将stderr重定向到stdout:
exec("/bin/weight 2>&1",$string_array);
答案 2 :(得分:0)
我想我已经弄清楚了。这个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
...
我能够通过在return_var
命令中添加exec()
参数来解决这个问题,如下所示:
$string_array;
exec("/bin/weight",$string_array,$return_code);
var_dump($string_array);
print($return_code);
返回了 '254'
(基本上是-2
),这意味着端口无法打开。感谢所有试图帮助解决这个问题的人。
只需将/dev/pts/0
上的权限更改为666
即可解决问题。