Я пытаюсь написать программу c++, которая будет запускать команды linux асинхронно и зарегистрировать обратный вызов для возвращаемых значений команды linux. то, что я точно хочу, - это написать служебную функцию, которой я передам два параметра: это команда linux, а другая - обратный вызов.
когда мы называем эту функцию утилиты, она не должна блокировать программу и продолжать выполнение программы. но после выполнения команд linux он вызовет обратный вызов, который мы передаем как второй параметр.
Я пробовал функцию c++ system(). и попробовали заголовки boost.process для запуска команд Linux. но все они блокируют способ вызова вызовов linux.из c++.
Я новичок в этом типе программирования типа асинхронного + обратного вызова.
Программа должна точно выглядеть так, как я пытался в программах node.js, которые я использую в своих программах node.js. который очень хорошо работает для меня, ссылка, за которой я следую за этим: http://www.dzone.com/snippets/execute-unix-command-nodejs
Пожалуйста, помогите мне сделать это в c++. какие улучшения мне нужно сделать в системном вызове c++, который отлично работает для меня, но блокирует. или у нас есть какое-то прямое средство, доступное в библиотеке c++ или boost.
ПРИМЕЧАНИЕ. Я использую компилятор g++ 4.3. это не c++ 0x или c++ 11.
Спасибо, Абхишек
Не совсем понятно, что вы хотите сделать, но вот какой-то код С++ 11, который, я думаю, выполнил бы трюк:
#include <thread>
#include <future>
#include <string>
#include <iostream>
#include <type_traits>
void system(const std::string& s)
{ std::cout << "Executing system with argument '" << s << "'\n"; }
// asynchronously (1) invoke cmd as system command and (2) callback.
// return future for (1) and (2) to caller
template<typename F>
std::future<typename std::result_of<F()>::type>
runCmd(const std::string& cmd, F callback)
{
auto cmdLambda = [cmd] { system(cmd); };
auto fut = std::async(std::launch::async,
[cmdLambda, callback] { cmdLambda(); return callback(); });
return fut;
}
int main()
{
auto fut = runCmd("ls", []{ std::cout << "Executing callback\n"; });
fut.get();
}
Для С++ 98 вы можете использовать Boost.Threads для фьючерсов и асинхронизации, и вы можете использовать Boost.Bind для замены lambdas.
Это должно по крайней мере начать.
Есть ли способ избежать boost.future, поскольку он создает новый поток. Можем ли мы это сделать, используя вызовы расширенной асинхронной библиотеки. Есть ли что-нибудь в boost.asio для этого, не создавая нити.