Chinaunix首页 | 论坛 | 博客
  • 博客访问: 295218
  • 博文数量: 44
  • 博客积分: 2276
  • 博客等级: 大尉
  • 技术积分: 439
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-01 09:07
文章分类

全部博文(44)

文章存档

2010年(1)

2009年(1)

2008年(30)

2007年(12)

分类: LINUX

2007-11-23 23:03:42

 
   现需要php调用c++程序,参考了网上一篇文章,修改后在本机(fedora7)上测试通过,现整理如下。

一、 编写test.cpp程序
     转到你的apache服务器的站点目录下(即放置web文件的目录),我的是 /var/www/html目录,在该     目录下编写程序。
   该简单程序的作用是通过命令行接受参数并显示出来,test.cpp代码如下:
#include
using namespace std;

int main(int argc,char *argv[]){
    cout<<"You passed "<<(argc-1)<<" argument"<<((argc-1)==1?"":"s")<<"."<    cout<<((argc-1)==1?"This ":"These ")<<"argument"<<((argc-1)==1?"":"s");
    cout<<" "<<((argc-1)==1?"is ":"are")<<":

"<
    for(int i=1;i        cout<<"argument["<"<    }
   
    return 0;
}
    程序中加入
的目的是为了使php调用该程序后的页面整齐(后面会看到的)。
    编译此程序:
    
#g++ test.cpp -o test
        如果编译不通过请把cout放到一行上,避免一个cout语句被断行,分割在好几行上。然后再编译。
        执行该程序,例如,给它传递三个参数:
#./test abc def ghi
     执行结果为:
You passed 3 arguments.
These arguments are:



argument[1]is:abc

argument[2]is:def

argument[3]is:ghi

   解释:
      1.main()函数带了两个参数:argc(命令行传入参数的个数)和argv(一个包含了所传参数实际            值的字符型指针数组)。这个两个参数能被C++编译器自动捕获.
          2.
cout<<"You passed "<<(argc-1)<<" argument"<<((argc-1)==1?"":"s")<<"."<
           这句话的意思是获得从执行命令行传入的参数的个数。argv这个字符型指针数组是从0开始检索           的,它默认包含一个实际的值(即本程序的路径,如果你打印argv[0],将显示.,即当前目        录),这个值由C++编译器自动地附加上去,所以argc的默认值是1,每给它传一个参数,该值      加1。条件操作符”?”是用来判断命令行传入地参数是否多于一个。例如,如果命令行过传入两个      参数,我们地程序将输出如下信息:
  
           You passed 2 arguments.
   二、编写cpp_test.php脚本文件
          在/var/www/html目录
      首先编写cpp_test.html文件,由它向cpp_test.php传递参数。
      其内容如下:









   

    输入你要传给c++程序的参数,各参数间以空格隔开。

   


   
  




      cpp_test.php内容如下:
echo '





';
echo '
';

if($_POST['args']!=""){
    echo 'what you input in the textbox are:';
    echo $_POST['args'];
    echo '

then the c++ program will execute as follows:


';
    /*call c++ aplications,the sapce right after ./test is necessary.
      It separate the command from its arguments*/
    $command="./test ".escapeshellcmd($_POST['args']);
    passthru($command);
}else{
    echo '
You did not enter anything in the textbox.';
}

echo '
';

    解释:
        函数eacapeshellcmd是用来当做安全检查工具,以过滤调一些如”,”,””和”\”等的特殊字符。        这可以防止一些用户企图输入某些字符来调用系统内部命令。
       
        我这里用了test的当前路径,就是/var/www/html目录下,tet程序文件就位于/var/www/html  目录下。当然也可使用绝对路径(不推荐);
  
       passthru($command);
  
  最后,我们使用PHP的函数passthru来执行变量$command所包含的命令并且将原始的执行结果输出到浏   览器上。在我的服务器上,返回结果的HTML页面如下:

      图一  cpp_test.html

     

     图二  cpp_test.php
  

   

 


  如果当你执行cpp_test.php教本程序的时候,如果你没有看到程序的任何输出信息,或许是开了安全模式。如果这样,系统将不会允许PHP脚本来执行系统内部程序。关于如何关闭安全模式,请访问网页http: //php.chinaunix.net/manual/zh/features.safe-mode.php,上面有详细的介绍。其次,在一些Unix系统上, PHP函数passthru不能将内部程序的输出传递给浏览页面,如果发生这种情况,可以用system函数来代替passthru函数。
  判断安全模式是否打开可用下面的代码(事先应在当前目录下准备一个文本文件sample.txt):

    readfile('./sample.txt');
?>

  如果出现如下错误:
     Warring:SAFE MODE restriction in effect.则说明安全模式启动了。可以到修改/etc目录下的php.ini中,查找safe_mode = on 修改为 safe_mode = Off即可。
  Unix操作系统非常强大,并且PHP允许开发者通过脚本以独立的线程来执行系统内部程序。本文的所给的例子非常的简单,但是只要再多花一点功夫,你可以写一个能更新Mysql数据库的c++程序,运行其他系统命令的程序或者是操作系统文件/目录结构的程序。但是,不管怎样,你都应该确保你的系统安全,绝对不能让任何其他的脚本程序随意访问系统内部程序。 
阅读(4444) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-10-09 21:38:39

你好,今天拜读了您的这篇文章,我按照您的程序走了一遍,为什么点击提交按钮之后只是执行 else 中的语句,即返回的界面只显示"You did not enter anything in the textbox" ?