выполнить команду linux асинхронно с обратным вызовом в c ++

0

Я пытаюсь написать программу 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.

Спасибо, Абхишек

Теги:
asynchronous
boost

2 ответа

1

Не совсем понятно, что вы хотите сделать, но вот какой-то код С++ 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.

Это должно по крайней мере начать.

  • 0
    Жирным шрифтом четко указано, что используемый компилятор не поддерживает C ++ 11
  • 2
    Да, но после недели без ответов я понял, что что-то лучше, чем ничего, и я предложил комментарии о том, как пересмотреть код для C ++ 98.
0

Есть ли способ избежать boost.future, поскольку он создает новый поток. Можем ли мы это сделать, используя вызовы расширенной асинхронной библиотеки. Есть ли что-нибудь в boost.asio для этого, не создавая нити.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню