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

时间:2011-11-14 17:58:54

标签: php c

如果我在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.inisafe_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就好了:

3 个答案:

答案 0 :(得分:1)

来自exec manual page

  

如果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即可解决问题。