使用c ++中的回调异步运行linux命令

时间:2014-02-15 04:30:21

标签: c++ linux node.js boost asynchronous

我正在尝试编写一个c ++程序,它将异步运行linux命令并为linux命令的返回值注册一个回调函数。我真正想要的是编写一个实用程序函数,我将传递两个参数,一个是linux命令,另一个是回调。

当我们调用此实用程序函数时,它不应该阻止程序并继续执行程序。但是一旦linux命令执行,它将调用我们作为第二个参数传递的回调。

我试过c ++ system()函数。并尝试过boost.process标头来运行 linux命令。但它们都是阻止调用linux调用的方式。来自c ++。

我是这种async + callback寄存器类型编程的新手。

该程序应该与我在node.js程序中使用的node.js程序中的程序完全相同。这对我来说非常有用,我关注的链接是http://www.dzone.com/snippets/execute-unix-command-nodejs

请帮我用c ++完成这项工作。我在c ++系统调用中需要做些什么改进才能完美地运行但是阻塞。或者我们在C ++或boost库中有一些直接的工具。

注意:我正在使用g ++ 4.3编译器。它不是C ++ 0x或C ++ 11。

谢谢, 阿布舍克巴克

1 个答案:

答案 0 :(得分:1)

目前还不是很清楚你想做什么,但这里有一些C ++ 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用于future和async,并且可以使用Boost.Bind替换lambda。

这至少应该让你开始。