doule0941 2013-07-08 09:24
浏览 161
已采纳

在php脚本中返回shell_exec()函数的参数

I am calling executable file with main() function from php script using exec(). Which works fine but return all printf() values rather only returning array:

main.cpp:

#include<stdio.h>
#include<string.h>
#include "foo.h"
int main(int argc, char *argv[] )
{
    char buffer[1024];
    char *ch;
    static int ar[2];
    strcpy(buffer,argv[1]);
    printf("Client : 
");
    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
              printf( "
%s filename
", argv[0] );
    }
    else 
    {
        printf("
string is :%s 
",buffer);
    ch=foo(buffer);
    ar[0]=((int*)ch)[0];
    ar[1]=((int*)ch)[1];
    printf("Counts is :%d  %d 
",ar[0],ar[1]);
    }
    return (int)ar;

}

my test.php

<?php
$s="critic worst";
escapeshellarg($s);
$a=array(shell_exec('/home/technoworld/Videos/LinSocket/client "nice bad"'));
print_r($a[0]);
//echo exec('whoami');
?>

Which shows output:

Client : string is :nice bad Positive count: 2 Negative count: 2 array item2 2 Count is :2 2

I also tried with exec() which also gives same prob. Can any one suggest how to get ar[0] and ar[1] from main.cpp?

Client : string is :nice bad Positive count: 2 Negative count: 2 array item2 2 

This is from all printf() present in foo.cpp file.

When I use exec() then it gives Count is :2 2

How to get exact ar[0] and ar[1]

  • 写回答

3条回答 默认 最新

  • duancenxie2233 2013-07-08 09:36
    关注

    Perhaps simply

    preg_match('/[0-9]*/', $output, $matches);
    

    If I'm not mistaken...

    To be sure:

    preg_match('Counts is :([0-9]*)[^0-9]*([0-9]*)/',$output,$matches);
    

    Also have a look at this question to find ouy how to use PHP and C(++) interactively

    A quick, and hacky ugly messy workaround could be:

    printf("%d",ar[0]);
    return ar[1];//end main function
    

    Then, in your PHP script:

    $a = array(shell_exec('/home/technoworld/Videos/LinSocket/client "nice bad"'),
               shel_exec('echo $?');
    );
    

    Then get the last numeric value from the output string, (preg_match('/([0-9]*)\w*$/',$a[0],$matches); should do it, and $a[1] will contain the value of ar[1] of the main.cpp file, because that was the exit code. Note that exit codes aren't for show. The signify something! Changeing them is generally a bad idea. I'd just change my main.cpp, and add the line:

    printf("@ar[0]=%d;ar[1]=%d@",ar[0],ar[1]);
    

    This prints a clearly formatted string, which is easy to parse using a regular expression. Assuming *ar held values 123 and 456 respectively:

    preg_match_all('/\]\=([^;@]*)/',$a[0],$matches);
    var_dump($matches[1]);//[123,456]
    

    Or better stil:

    $parts = explode('@', $a[0]);
    echo $parts[1];//ar[0]=123;ar[1]=456
    

    Bottom line:

    Add this to your main function in main.cpp:

    printf("@ar[0]=%d;ar[1]=%d@",ar[0],ar[1]);
    

    and, to get the int values in php:

    $a = array(shell_exec('..'));
    preg_match_all('/[^=]*\=([^;@]*)/',$a[0],$matches);
    var_dump($matches[1]);
    

    That should do it.

    $a = array();
    $b = array();
    if (preg_match_all('/[^=]*\=([^;@]*)/', shell_exec('your command'), $matches))
    {
       $a[] = (int) $matches[1][0];//optionally cast to int
       $b[] = (int) $matches[1][1];
    }
    

    That's all... not sure why $a and $b need to be arrays, but that's probably because you're going to call the client bin a couple of times.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多