Извлечение результатов / результатов из выполненного файла.pexe
Моя цель - преобразовать программу на C++ в файл.pexe, чтобы потом запустить ее на удаленном компьютере. Файл.pexe будет содержать некоторые математические формулы или функции для вычисления на удаленном компьютере, поэтому я в основном буду использовать вычислительную мощность удаленного компьютера. Для всего этого я буду использовать nacl_sdk с библиотекой Pepper и буду благодарен, если кто-нибудь сможет прояснить некоторые вещи для меня:
- Можно ли сохранить выходные данные исполняемого файла.pexe на удаленном компьютере в файл, если это возможно, то как? Какие форматы файлов поддерживаются?
- Можно ли автоматически отправлять выходные данные исполняемого файла.pexe на удаленном компьютере на хост-компьютер, если это возможно, то как?
- Нужно ли что-то устанавливать, чтобы это работало на удаленном компьютере?
Любое предложение будет оценено.
2 ответа
Из того, что я пробовал, кажется, что вы не можете захватить материал, который ваш pexe пишет в стандартный вывод - он просто идет в стандартный вывод браузера (мне потребовались часы, чтобы понять, что он куда-то идет - я следовал плохому учебнику это заставило меня поверить, что вывод pexes будет опубликован на стороне javascript, и мне было интересно, почему он "ничего не сделал").
В настоящее время я работаю над переносом своих вещей на.pexe, и это оказалось довольно простым, но это связано с тем, как я пишу свои программы:
Я пишу свои (C++) программы так, что все части кода читают входные данные только из std::istream
возразить и записать свои выводы в некоторые std::ostream
объект. Тогда я просто прохожу std::cin
а также std::cout
на вызов верхнего уровня и может использовать программу в интерактивном режиме в оболочке. Но тогда я могу легко поменять вызов верхнего уровня, чтобы использовать std::ifstream
а также std::ofstream
использовать программу для пакетной обработки (без труб из cat
и перенаправление на файлы, что может быть проблематично при некоторых обстоятельствах).
Так как я пишу свои программы, я могу просто реализовать такой обработчик сообщений
class foo : public pp::Instance {
... ctor, dtor,...
virtual void HandleMessage(const pp::Var& msg) override {
std::stringstream i, o;
i << msg.AsString();
toplevelCall(i,o);
PostMessage(o.str());
}
};
поэтому данные, которые я получаю из браузера, помещаются в поток строк, который остальная часть кода может использовать для ввода. Он получает другой поток строк, куда остальная часть кода может записывать свои выходные данные. А потом я просто отправляю этот вывод обратно в браузер. (Недостатком является то, что вам нужно дождаться завершения программы, прежде чем вы увидите результат - вы можете получить класс из ostream и получить оператор <<, отправляющий сообщение непосредственно в браузер... nacl должен иметь класс, который это делает - Я не знаю, так ли это на самом деле...)
На стороне HTML / JS, вы можете иметь textarea
и pre
(который мне нравится называть stdin и stdout;-)) и кнопка, которая отправляет содержимое текстовой области в pexe - и имеет обработчик событий, который записывает сообщения из pexe в pre
как это
<embed id='pnacl' type='application/x-pnacl' src='manifest.nmf' width='0' height='0'/>
<textarea id="stdin">Type your input here...</textarea>
<pre id='stdout' width='80' height='25'></pre>
<script>
var pnacl = document.getElementById('pnacl');
var stdout = document.getElementById('stdout');
var stdin = document.getElementById('stdin');
pnacl.addEventListener('message', function(ev){stdout.textContent += ev.data;});
</script>
<button onclick="pnacl.postMessage(stdin.value);">Submit</button>
Поздравляем! Ваша программа теперь работает в браузере!
Я не закончил с переносом своих компиляторов, но кажется, что это будет работать даже для вещей, которые используют flex & bison (вам нужно только скопировать FlexLexer.h в каталог include pnacl sdk и игнорировать предупреждения о "регистре"). спецификатор места хранения:-)
Вы используете.pexe в браузере? Это обычный случай.
Я рекомендую использовать nacl_io для эмуляции POSIX в браузере (также посмотрите на file_io. Это позволит вам сохранять файлы локально, извлекать их в любом формате, который вам нравится.
Для отправки вывода используйте обычные возможности браузера, такие как XMLHttpRequest. Для этого вам нужен PNaCl, чтобы поговорить с JavaScript, вы можете посмотреть на некоторые примеры.
Подойдет обычный веб-сервер, это действительно зависит от того, что вы делаете.