2011-11-19 56 views
6

在Linux下,如果我想將純字符串從PHP傳遞到C,我該怎麼做? 我已經嘗試做多遠:在Linux和Linux之間傳遞PHP和C之間的數據可執行文件

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

在PHP和

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

用C

一切正常,但是當我傳遞一個字符串久一些比MAX_ARG_STRLEN(131072),它會不再返回0,而是返回127,這是命令未找到....

是否有任何其他方式將字符串數據傳遞給一個Linux可執行文件?或者有什麼方法可以克服MAX_ARG_STRLEN問題?

+0

只是添加,我傳遞可能會超過393216個字符字符串,因爲((256^2)* 6) * 2;我想將它們存儲在一個文件中,但隨後幾乎1MB大小,@Linus Kleen的解決方案是我目前最好的解決辦法,到目前爲止 – tom91136

+0

是不是真的只是一個字符串或者是你想傳遞一個數據結構? – aurora

+0

更像一些實驗之後的數據結構 – tom91136

回答

6

你可以使用popen()打開一個管道,可執行::

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

,就如之前所說,在你的C程序從stdin閱讀:

在C程序

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

使用更「安全」 210而不是exec('/bin/echo'),因爲您可以編寫可由shell解釋的字符(&,|,...)。請注意,從PHP的popen()返回的句柄必須pclose()關閉。

0

嘗試使用 echo和管道輸出到您的 C可執行文件,而不是使用參數的個數:

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

@sarnold在評論中提到這是錯的。看看@Linus Kleenanswer

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

你'echo'命令對參數長度完全相同的限制。 – sarnold

+0

@sarnold我想限制是因爲'C'方案。感謝您的糾正。 – fardjad

+0

這是一個內核強制限制 - 今天128KB實際上比以前要大得多。 :) – sarnold

3

有幾個選項立即映入腦海:

  • Store中的文件數據,並通過在命令行上的文件名。這很容易和簡單,但需要權限來創建和存儲文件系統某處的文件。

  • 打開你的程序和C程序之間的管道;讓這兩個進程都運行,至少在C程序已經消耗完整個字符串內容之前。 popen()是圍繞此方法的一個方便包裝,但它確實假定標準輸入是正確的目的地,並且它是單向的。自己管理管道可讓您使用不同的文件描述符 - 您可以通過命令行參數告訴子文件讀取哪個文件描述符。 (見gpg(1)的命令行選項--passphrase-fd明白我的意思。)

  • 使用的SysV或POSIX shared memory segment你在PHP中的數據,然後附加到共享內存段在C程序中讀取內容。需要注意的是共享內存段堅持,所以你必須當您完成後,他們清理 - 否則你會泄漏內存。這並不需要權限創建文件系統中的文件和可能比使用管道處理,並保持工藝活足夠長的一個完全寫入數據,另一個完全讀取數據一個更好的機制。

1

如果它更像是一個數據結構而不是字符串,那麼使用嵌入式web服務器怎麼辦?乍一看,這聽起來有點小題大做你的目的,但貓鼬例如是一個非常輕量級嵌入Web服務器:

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

還有你有相同問題的一個很好的教程,一個PHP之間transfering數據應用程序和一個C/C++應用程序。這是德語,但...但也許谷歌翻譯可以幫助:

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