Reputation: 6632
There's a handy function in PHP called proc_open
. It could be used to call an executable, opening its stdin
, stdout
and stderr
as pipes.
Is there a good cross-platform version of this function in C++? The only googlable thing is this tutorial for Windows (though code from it just hangs).
Upvotes: 2
Views: 653
Reputation: 393613
You could probably get 'somewhere' with
popen
(http://linux.die.net/man/3/popen)
pstreams library (POSIX process control) - I have no prior experience with this, but it looks solid and was written by Jonathan Wakely
Boost Process (http://www.highscore.de/boost/process/, not in boost yet)
Poco::Process launch
(http://www.appinf.com/docs/poco/Poco.Process.html#13423)
static ProcessHandle launch(
const std::string & command,
const Args & args,
Pipe * inPipe,
Pipe * outPipe,
Pipe * errPipe
);
Upvotes: 3
Reputation: 22187
Edit:
As I can see, Boost.Process is no longer in the active development, and the examples are not compiling with the current (1.54) and not so current (1.4x - I forgot to write down the exact version before I upgraded boost) versions of boost, so I need to retract my recommendation.
Original post
There is Boost.Process library which you could use. You can find good example here. Also, check this chapter from here, as well as this.
//
// Boost.Process
// ~~~~~~~~~~~~~
//
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
// Copyright (c) 2008 Boris Schaeling
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include <boost/process.hpp>
#include <string>
#include <vector>
#include <iostream>
namespace bp = ::boost::process;
bp::child start_child()
{
std::string exec = "bjam";
std::vector<std::string> args;
args.push_back("--version");
bp::context ctx;
ctx.stdout_behavior = bp::capture_stream();
return bp::launch(exec, args, ctx);
}
int main()
{
bp::child c = start_child();
bp::pistream &is = c.get_stdout();
std::string line;
while (std::getline(is, line))
std::cout << line << std::endl;
}
Upvotes: 1