2014-02-08 161 views
4

我有一個線程開始一個boost ::流程應用程序,用代碼的線程運行這樣的:的boost ::進程寫入標準輸入

void Service::Run() 
{ 
    printf("Starting thread for service ID %i\n", this->sid); 

    // Set up a stream sink for stdout, stderr and stdin 
    bprocess::pipe pstdIn = create_pipe(); 
    bprocess::pipe pstdOut = create_pipe(); 
    file_descriptor_sink  fdSink(pstdIn.sink, close_handle); 
    file_descriptor_source fdSrc(pstdOut.sink, close_handle); 

    // Set up the read write streams 
    this->stdIn = new fdistream(fdSink); 
    this->stdOut = new fdostream(fdSrc); 

    // Execute the service 
    try 
    { 
     child proc = execute(
      set_args(this->args), 
      inherit_env(), 
      bind_stdin(fdSrc), 

      throw_on_error() 
     ); 

     printf("PID: %i\n", proc.pid); 

     // Wait for the application to end then call a cleanup function 
     int exit_code = wait_for_exit(proc); 

     printf("Service died, error code: %i\n", exit_code); 
    } 
    catch(boost::system::system_error err) 
    { 
     printf("Something went wrong: %s\n", err.what()); 
    } 

    this->manager->ServiceDie(this->sid); 

    return; 
} 

由於此功能是阻塞之一,它基本上是等待被殺的服務(外部或根據我的需要;通過stdin輸入以優雅地停止應用程序)。

我不知道如何寫入子進程的標準輸入。我曾經嘗試這樣做:

*(this->stdIn) << "stop\n"; 

在類的Service是被呼叫在另一個線程(Manager類)公共函數中。然而,這沒有結果。

我該如何寫信給孩子的stdin proc

回答

3

下面是改編自樣品here演示:

你可以看到它 Live on Coliru 可悲的是多數民衆贊成推動Coliru的限制。可後來:

#include <boost/process.hpp> 
#include <boost/assign/list_of.hpp> 
#include <string> 
#include <vector> 
#include <iostream> 

using namespace boost::process; 

int main() 
{ 
    std::string exec = find_executable_in_path("rev"); 
    std::vector<std::string> args = boost::assign::list_of("rev"); 

    context ctx; 
    ctx.environment = self::get_environment(); 
    ctx.stdin_behavior = capture_stream(); 
    ctx.stdout_behavior = capture_stream(); 
    child c = launch(exec, args, ctx); 

    postream &os = c.get_stdin(); 
    pistream &is = c.get_stdout(); 

    os << "some\ncookies\nfor\ntasting"; 
    os.close(); 

    std::cout << is.rdbuf(); 
} 

輸出:

emos 
seikooc 
rof 
gnitsat 

現在,如果你需要它真正異步的,有使用Boost短耳進一步down that page

+0

出於某種原因另一個樣品,我不知道有'get_stdin()'函數...不知道爲什麼,哦,我也沒有'launch()'。 – Zinglish

+0

Bah,在我的回覆中,我忘了提及什麼版本的Boost :: Process我有...我有一箇舊版本(0.5)。我已經更新,我會再試一次。儘管謝謝你的幫助! – Zinglish

+0

@Zinglish你確定版本0.5是舊的嗎?你現在使用哪個版本? –