2014-02-15 44 views
0

我正在嘗試編寫一個C++程序,它將異步運行linux命令,併爲linux命令的返回值註冊回調。我真正想要的是編寫一個實用函數,我將傳遞兩個參數一個是linux命令,另一個是回調函數。與C++中的回調異步運行linux命令

當我們調用這個效用函數時,它不應該阻塞程序並繼續執行程序。但一旦執行了linux命令,它將調用我們作爲第二個參數傳遞的回調。

我試過C++ system()函數。並試圖使用boost.process頭文件運行 的linux命令。但它們都阻止了從C++調用linux調用的方式。

我是新來的這種類型的異步+回調寄存器類型的編程。

該程序應該看起來像我在我的node.js程序中使用的node.js程序中嘗試的那個程序。這對我的作品非常好,我遵循這個鏈接是http://www.dzone.com/snippets/execute-unix-command-nodejs

請幫我在C++中完成這項工作。我需要在C++系統調用中做什麼改進,這對我來說是完美的,但卻是阻塞的。或者我們是否有一些可用C++提供的直接工具或增強庫。

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

感謝, 阿布舍克

回答

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進行期貨和異步操作,並且可以使用Boost.Bind替換lambda表達式。

這應該至少讓你開始。

+0

在** bold **中清楚地表明瞭正在使用的編譯器不支持C++ 11 – SomeWittyUsername

+2

是的,但是在一週沒有答案的情況下,我覺得有些東西比沒有好,我提供了評論關於如何修改C++ 98的代碼。 – KnowItAllWannabe

0

有什麼辦法可以避免boost.future,因爲它會創建一個新的線程。我們可以使用boost異步庫調用來做到這一點。有沒有什麼可用的boost.asio做到這一點,而不創建任何線程。