В 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"); // ...