【问题标题】:Executing shared library file from php script从 php 脚本执行共享库文件
【发布时间】:2013-07-04 05:43:46
【问题描述】:

我创建了共享库 client.so。当我执行它时 main() 函数被执行,它从用户读取字符串并调用函数ch=foo(buffer);

Main.cpp 在这里:

#include<stdio.h>
#include "foo.h"

    int main()
    {
        char buffer[1024];
        char *ch;
        printf("Client : \n");
        printf("Enter sentence to send to the server (press enter)\n");
        fgets(buffer, 1024, stdin);
        ch=foo(buffer);

        return 0;
    }

使用 exec 函数我们可以执行 c 程序。但是在 php 脚本中,如果我这样做,我将无法选择从用户读取字符串。

我希望用户可以在浏览器本身中输入字符串并将该字符串传递给主函数(可能使用 argv,argc- 但我不知道该怎么做)。然后主函数应该像往常一样调用 foo(buffer) 等等。

foo(buffer) 将返回存储在 char* ch 中的数组,我想在 php 脚本中接收。

我有两个选择: 1] 从用户读取文本框中的字符串并将其传递给具有 main() 函数的共享库文件。哪个被执行并在 php 脚本中返回“ch” 2] 执行共享库文件(就像我们在终端./client 中所做的那样)并在运行时提供字符串输入并让整个程序运行。但我不知道这是否可能。 #包括 #include "foo.h"

    int main()
    {
        char buffer[1024];
        char *ch;
        printf("Client : \n");
        printf("Enter sentence to send to the server (press enter)\n");
        fgets(buffer, 1024, stdin);
        ch=foo(buffer);

        return 0;
    }

谁能给我一些关于如何实现这一点的建议!

【问题讨论】:

  • 我会重写 C 程序以从命令行获取句子
  • @hek2mgl:这是个不错的选择,但在那之后呢?
  • 之后调用它就像:exec('path/to/yourprog "yoursentence"'); .. !!不要错过之前使用escapeshellarg($sentence);
  • @hek2mgl :我做了这些更改,但没有任何改进。我的代码: $s="hello";转义shellarg($s); $a=exec('/home/technoworld/Videos/LinSocket "./client $s"');客户端是我要执行的共享库文件!
  • @hek2mgl:很好的尝试!但给出同样的错误!

标签: php c++ exec php-extension


【解决方案1】:

设置权限后按以下方式执行即可解决问题:

$a=exec('/home/technoworld/Videos/LinSocket/client "critic good"'); 

不需要给./client,就像我犯了错误一样!

client 是我想要执行的可执行文件,“critic good”是要传递的参数!

【讨论】:

  • exec() 将仅返回命令的最后一行输出。你应该使用shell_exec()
【解决方案2】:

你不能这么简单!

  1. 你必须决定,如果你真的想“执行”搞砸你的网络服务器
  2. 您必须将外部帮助工具编码为“非阻塞”应用程序,这意味着:没有 CLI 输入内容。如果您将参数/参数字符串直接“输入”和“输出”到“非阻塞”应用程序,则可以做到这一点。
  3. 您必须使用正确的权限保护网络服务器和包装工具。
  4. 您必须实现超时(或者您有很多僵尸 pid)
  5. 您必须对应用程序“线程”安全进行编码(网络服务器必须启动应用程序的多个实例,这会为每个请求(来自已登录用户)生成一个会话。
  6. 你必须测试你的申请关于志愿者(缓冲区溢出,,,,)

如果您朝着正确的方向前进,您可以编写一个专门用于您的网络服务器 (apache) 的应用程序。这意味着:

  1. 在没有 UB 的情况下编写您的应用程序。
  2. 更改您的网络服务器 (apache) 配置:添加目录证券,添加应用程序处理程序,它可以处理每个 .extension 的文件,或与 CGI 界面。
  3. 这意味着您拥有一个稳定、快速运行的系统,并且拥有与家用电脑一样多的内存。

换句话说:您不应该在生产系统的开发阶段使用您的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多