在Linux中传递PHP和C可执行文件之间的数据

时间:2011-11-19 09:18:27

标签: php c linux string parameter-passing

在Linux下,如果我想将纯字符串从PHP传递给C,我该怎么做? 我尝试过的是:

exec("./myexec.bin -a mystring");
PHP中的

getopt(argc,argv, "a:");

在C

一切正常,但是当我传递的字符串超过MAX_ARG_STRLEN(131072)时,它将不再返回0而是返回127,这是命令未找到....

有没有其他方法将字符串数据传递给linux可执行文件?或者有没有办法克服MAX_ARG_STRLEN问题?

4 个答案:

答案 0 :(得分:6)

您可以使用popen()打开可执行文件的管道:

$fp = popen('./myexec.bin', 'w');
fwrite($fp, $data);
pclose($fp);

然后,如前所述,从C程序中的stdin读取:

fopen(stdin, "r");
// ...

使用popen()而不是exec('/bin/echo')更“安全”,因为您可以编写由shell解释的字符(&,|,...)。请注意,从popen() 返回的句柄必须pclose()关闭。

答案 1 :(得分:3)

有一些选择让人想起:

  • 将数据存储在文件中并在命令行上传递文件名。它既简单又简单,但需要在文件系统的某处创建和存储文件的权限。

  • 在程序和C程序之间打开一个管道;保持两个进程都在运行,至少在C程序消耗了字符串的全部内容之前。 popen()是这种方法的一个方便的包装器,但它确实假定标准输入是正确的目标,并且它是单向。自己管理管道允许您使用不同的文件描述符 - 您可以通过命令行参数告诉子项要读取哪个文件描述符。 (请参阅gpg(1)的命令行选项--passphrase-fd,了解我的意思。)

  • 使用SysV或POSIX shared memory segment以PHP格式存储数据,然后从C程序附加到共享内存段以读取内容。请注意,共享内存段仍然存在,因此您必须在完成后清理它们 - 否则您将泄漏内存。这不需要在文件系统中创建文件的权限,并且可能是一种比处理管道和保持两个进程足够长时间以便完全写入数据的机制更好的机制另一个是完全读取数据。

答案 2 :(得分:1)

如果它更像是数据结构而不是字符串,那么使用嵌入式Web服务器呢?乍一看,它可能听起来像你的目的矫枉过正,但猫鼬是一个非常轻量级的嵌入式网络服务器:

http://code.google.com/p/mongoose/

还有一个很好的教程,关于你在PHP应用程序和C / C ++应用程序之间传输数据的完全相同的问题。虽然它是德语,但也许谷歌翻译可以提供帮助:

http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/

答案 3 :(得分:0)

尝试使用echo并将输出传输到C可执行文件,而不是使用args:

exec("/bin/echo | ./myexec.bin");

在评论中提到@sarnold这是错误的。查看@Linus Kleen answer

在你的C程序中:

fopen(stdin, "r");
// ...