|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
说说这一个月左右的学习情况和心得吧!我个人认为,既然决定了去做一件事,那就要以认真的态度去对待!既然决定来学习了,那不管当初是抱着怎样的心态来到这个培训班的,都要让自己认真的投入到学习中。c++|web|法式|履行 1、简介
假如你对Unix/Linux有所懂得的话,你应当晓得他们大都自带了C和C++的编译器,分离是GCC和G++。Unix在法式装置及Make等很多中央利用到了这些编译器。使用一些掌握台号令,C++和PHP, 我将向你引见如何生成一个完全的C++法式例子,他可以在用PHP法式来履行,并能取得响应的输入了局。我将师长教师成C++法式代码,并编译它,谈后会商咱们将假如经由过程利用PHP的函数passthru来履行这个法式。从某种意义下去说,这边文章给咱们供应一种经由过程Web页面来会见普通法式的办法。
为了能更好的了解这篇文章,你应当有一台运转着apache和最新版本php的unix/Linux办事器。同时也应当把握C++, unix掌握台号令,固然一些PHP的编程经历也是必须的。
2、编写一个C++法式
例如,咱们可以写一个可以经由过程号令行还吸收参数的C++ 复杂法式,并定名为Sampleapp.然后咱们可以依照上面的体例给他传递三个分歧的参数 :
Sampleapp ?参数一 ?参数二 ?参数三
这个法式的功效是能输入传递给他的参数的个数和每一个参数的值,然后咱们可以用PHP剧本法式来履行编译好的C++法式。
使用你习气的文本编纂器,新建一个名为Sampleapp.cpp 的文件,再此文件中输出以下的代码:
#include <iostream.h>
int main(int argc, char* argv[])
{
cout << endl << "You passed " << argc-1 << " arguement"
<< (argc-1 == 1 ? "" : "s") << "." << endl;
cout << (argc-1 == 1 ? "This" : "These")
<< " arguement" << (argc-1 == 1 ? "" : "s") << " "
<< (argc-1 == 1 ? "is" : "are") << ": " << endl << endl;
for(int i = 1; i < argc; i++)
cout << "[" << i << "] " << argv[i] << endl;
return 0;
}
这个C++法式包括的法式的进口点:main(),main()函数带了两个参数:argc(号令行传入参数的个数)和argv(一个包括了所传参数实践值的字符型指针数组)。这个两个参数能被C++编译器主动捕捉。
cout << endl << "You passed " << argc-1 << " arguement"
<< (argc-1 == 1 ? "" : "s") << "." << endl;;
这句话的意思是取得从履行号令行传入的参数的个数。Argv这个字符型指针数组是从0入手下手检索的,它最少包括一个实践的值(即本法式的途径和称号),这个值由C++编译器主动地附加上去。前提操作符”?”是用来判别号令行传上天参数是不是多于一个。例如,假如号令行过传入两个参数,咱们地法式将输入以下信息:
You passed 2 arguments.
cout << (argc-1 == 1 ? "This" : "These")
<< " arguement" << (argc-1 == 1 ? "" : "s") << " "
<< (argc-1 == 1 ? "is" : "are") << ": " << endl << endl;
接上去,咱们一样用前提操作符来输入另外一句话。不外要记住,即便咱们不从法式履行号令行传入任何参数,main函数地argv[]参数也包括一个值。一样地,假如咱们从号令行传入两个参数给法式,法式将输入以下地信息:
These arguments are:
for(int i = 1; i < argc; i++)
cout << "[" << i << "] " << argv[i] << endl;
最初,main函数一一的输入号令行传入的每一个参数,它用到了一个复杂的for(;;)轮回语句,这个函数能依据参数的个数将参数值一个一个的输入。假设咱们传给法式两个参数”first”和second”, for轮回输入的了局以下:
[1] ?first
[2] ?second
以上是关于这个C++法式的复杂申明,它的功效非常复杂,就是将号令行传入的参数用cout函数显示在输入屏幕上。
接上去,咱们将编译这个.cpp文件,假如你在windows平台下,需求telnet到所利用的server上。在这里,咱们利用大多Unix机械上都供应的G++编译器来编译这个源文件。不外为了确信你的机械装置了G++,你可以输出以下号令:which g++。假如G++已装置了,Unix shell将显示出G++地点的全途径。假如没有装置,它将提醒你说”command couldn’t be found”. 你可以在这里下载到G++.
在源文件地点的目次输出以下G++号令:
g++ -c sampleapp.cpp.
经由过程这个号令,咱们就将.cpp文件编译成了包括机械代码的方针文件。经由过程 ls ?a号令,你可以发明在本目次下呈现了一个新文件sampleapp.o,这就是.cpp源文件被编译成机械码的了局。不外咱们终究想要的是一个可履行文件,由于咱们还要输出以下的G++号令:
g++ sampleapp.cpp ?o sampleapp
如许咱们就取得了一个名为sampleapp的可履行文件。不外注重的是,Unix下的可履行文件跟Windows纷歧样,它没有任何后缀。
上面咱们可以来查验一下法式履行的了局,假如以下号令:
sampleapp one -two /three
咱们可以看到以下的履行了局:
You passed 3 arguments.
These arguments are:
[1] one
[2] ?two
[3] /three
如今,可履行的C++法式成生终了,上面咱们将生成一个可以经由过程 web阅读器来会见这个法式的PHP教本法式。
3、生成PHP剧本法式
为了能经由过程Internet来挪用咱们的C++法式,咱们需求生成一个PHP剧本法式。这个PHP剧本法式将有一个Form表单,以便用户能输出可以传给法式Sampleapp的参数。PHP剧本的代码太长就不在这里全体列出了,需求的话可以经由过程上面的地址来下载它。(Php code)
if(@$submit)
{
}
else
{
}
起首,剧本法式反省看变量$submit是不是有值,这个变量$submit的值是法式前面的Form表单提交后传递过去的,它缺省为空值。符号@的感化是当变量$submit的值不存在的时疏忽相干的毛病信息。
因为变量$submit缺省为空,所以一入手下手履行else{}中的代码,它在阅读器上复杂的显示一个Form表单。Form的action属性设为变量$PHP_SELF,即表单提交后前往本页。同时Form表单包括了一个文本输出条,这是用来让用户输出要传递给C++法式的号令行参数。Form以下图所示:
一旦咱们输出履行号令并提交表单,变量$submit(即按钮Go的名字)就取得一个值,如许PHP教本将履行if{}之间的代码。
if($args == "")
echo "<h1>You didn't enter any arguments.</h1>";
else
{
echo "<h1>SampleApp Result</h1>";
$command = "/htdocs/sampleapp " . escapeshellcmd($args);
passthru($command);
}
变量$args是主动发生的,它的值是Form表单中文本输出条传过去的值。假如没有输出任何信息,法式将复杂的告知用户没有输出任何值。
假如用户输出任何非空的信息,法式将把text域的值,即变量$args传给C++法式。上面这段代码就是履行C++的法式的履行号令:
$command = "/htdocs/sampleapp " . escapeshellcmd($args);
函数eacapeshellcmd是用来当作平安反省东西,以过滤调一些如”,”,””和”\”等的特别字符。这可以避免一些用户妄图输出某些字符来挪用体系外部号令。
例如,假如你在Form表单的text域中输出”1 ?two /three”,那末变量$command的值就为: /htdocs/sampleapp 1 ?two /three
你能发明咱们界说了法式sampleapp的全途径,在这个例子中,法式文件位于/htdocs目次下。你可以依据的本人法式地点的目次做响应的修正。
passthru($command);
最初,咱们利用PHP的函数passthru来履行变量$command所包括的号令而且将原始的履行了局输入到阅读器上。在我的办事器上,前往了局的HTML页面以下:
w在本文行将停止之前,几个能够碰着的成绩我想说一下。起首,当你履行sampleapp.php教本法式的时分,假如你没有看到法式的任何输入信息,也许是开了平安形式。假如如许,体系将不会答应PHP剧本来履行体系外部法式。关于若何封闭平安形式,请会见网页http://www.php.net/manual/en/features.safe-mode.php,下面有具体的引见。其次,在一些Unix体系上,PHP函数passthru不克不及将外部法式的输入传递给阅读页面,假如产生这类情形,可以用system函数来取代passthru函数。
4、结论
从本的例子可以看出,Unix操作体系十分壮大,而且PHP答应开辟者经由过程剧本以自力的线程来履行体系外部法式。本文的所给的例子十分的复杂,然而只需再多花一点工夫,你可以写一个能更新Mysql数据库的c++法式,运转其他体系号令的法式或是操作体系文件/目次布局的法式。然而,不论如何,你都应当确保你的体系平安,相对不克不及让任何其他的剧本法式随便会见体系外部法式。 你发奋努力,熟悉了安全方面的问题,然后又设计了一些程序,感觉还不错。 |
|