Передача данных между исполняемыми файлами 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 ?

Вы можете использовать popen() чтобы открыть канал для исполняемого файла:

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

Затем, как было предложено ранее, прочитайте с stdin в своей программе на C:

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

«Безопаснее» использовать popen() вместо exec('/bin/echo') потому что вы можете писать символы, которые иначе интерпретировались оболочкой (&, |, …). Обратите внимание, что дескриптор, возвращаемый из popen() PHP, должен быть закрыт с помощью pclose() .

Напоминаем сразу несколько вариантов:

  • Храните данные в файле и передайте имя файла в командной строке. Это легко и просто, но требует разрешения создавать и хранить файлы где-то в файловой системе.

  • Откройте трубку между вашей программой и программой C; оставьте оба процесса запущенными, по крайней мере, до тех пор, пока программа C не поглотит все содержимое вашей строки. popen() является удобной оболочкой вокруг этого подхода, но предполагает, что стандартный ввод является правильным назначением, и он является однонаправленным . Управление самими трубами позволяет использовать другой файловый дескриптор – и вы можете сообщить ребенку, какой файловый дескриптор читать через аргумент командной строки. (См. --passphrase-fd командной строки gpg(1) --passphrase-fd чтобы понять, что я имею в виду.)

  • Используйте сегмент разделяемой памяти SysV или POSIX для хранения данных на PHP, а затем присоедините их к сегменту разделяемой памяти из вашей программы C, чтобы прочитать содержимое. Обратите внимание, что сегменты разделяемой памяти сохраняются , поэтому вы должны очистить их после завершения, иначе вы будете утечка памяти. Это не требует разрешений на создание файлов в файловой системе и может быть более удобным механизмом, чем работа с трубами, и поддерживать оба процесса достаточно долго, чтобы можно было полностью записать данные, а другое – полностью прочитать данные.

Если это больше похоже на структуру данных, чем на строку, то как насчет использования встроенного веб-сервера? На первый взгляд это может показаться излишним для вашей цели, но mongoose, например, очень легкий встраиваемый веб-сервер:

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

Также есть хороший учебник по той же самой проблеме, что и у вас, передача данных между приложением PHP и приложением C / C ++. Это на немецком, хотя … но, возможно, переводчик Google может помочь:

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

попробуйте использовать echo и вывести вывод в исполняемый файл C вместо использования args:

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

как @sarnold упоминается в комментариях, это неправильно. Посмотрите на ответ @Linus Kleen .

в вашей программе на C:

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