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
?
出於某種原因另一個樣品,我不知道有'get_stdin()'函數...不知道爲什麼,哦,我也沒有'launch()'。 – Zinglish
Bah,在我的回覆中,我忘了提及什麼版本的Boost :: Process我有...我有一箇舊版本(0.5)。我已經更新,我會再試一次。儘管謝謝你的幫助! – Zinglish
@Zinglish你確定版本0.5是舊的嗎?你現在使用哪個版本? –