Передача данных между исполняемым файлом PHP и C в Linux - PullRequest
6 голосов
/ 19 ноября 2011

В 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 ]

6 голосов
/ 19 ноября 2011

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

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

Затем, как ранее предлагалось, прочитать из stdin в вашей C-программе:

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

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

3 голосов
/ 19 ноября 2011

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

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

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

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

1 голос
/ 19 ноября 2011

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

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

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

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

0 голосов
/ 19 ноября 2011

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

<strike>exec("/bin/echo | ./myexec.bin");</strike>

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

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

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