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

Я пытаюсь написать программу на С++, которая будет асинхронно запускать команды Linux и регистрировать обратный вызов для возвращаемых значений команды Linux. что я точно хочу, так это написать служебную функцию, которой я передам два параметра: один - команда linux, а другой - обратный вызов.

когда мы вызываем эту служебную функцию, она не должна блокировать программу и продолжать выполнение программы. но как только команды Linux будут выполнены, он вызовет обратный вызов, который мы передаем в качестве второго параметра.

Я пробовал функцию С++ system(). и попробовали заголовки boost.process для запуска команд Linux. но все они блокируют способ вызова вызовов Linux из С++.

Я новичок в этом типе программирования асинхронного + обратного вызова.

Программа должна выглядеть точно так же, как я пробовал в программах node.js, которые я использую в своих программах node.js. который очень хорошо работает для меня, ссылка, по которой я перехожу для этого, это http://www.dzone.com/snippets/execute-unix-command-nodejs

Помогите, пожалуйста, сделать это на С++. какие улучшения мне нужно сделать в системном вызове С++, который отлично работает для меня, но блокирует. или у нас есть какое-то прямое средство, доступное в C++ или библиотеке boost.

ПРИМЕЧАНИЕ. Я использую компилятор g++ 4.3. это не C++0x или C++11.

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


person Mr.100    schedule 15.02.2014    source источник


Ответы (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();
}

Для C++98 вы можете использовать Boost.Threads для фьючерсов и асинхронности, а Boost.Bind — для замены лямбда-выражений.

Это должно, по крайней мере, заставить вас начать.

person KnowItAllWannabe    schedule 21.02.2014
comment
Довольно четко выделено жирным шрифтом, что используемый компилятор не поддерживает C++11. - person SomeWittyUsername; 21.02.2014
comment
Да, но после недели без ответов я понял, что что-то лучше, чем ничего, и предложил комментарии о том, как пересмотреть код для C++98. - person KnowItAllWannabe; 21.02.2014