5 #include <init.capnp.h> 6 #include <init.capnp.proxy.h> 14 #include <kj/common.h> 26 static auto Spawn(
mp::EventLoop& loop,
const std::string& process_argv0,
const std::string& new_exe_name)
29 const int fd =
mp::SpawnProcess(pid, [&](
int fd) -> std::vector<std::string> {
31 path.remove_filename();
33 return {path.
string(), std::to_string(fd)};
35 return std::make_tuple(mp::ConnectStream<InitInterface>(loop, fd), pid);
41 std::ofstream(
"debug.log", std::ios_base::app) << log_data.
message << std::endl;
44 int main(
int argc,
char** argv)
47 std::cout <<
"Usage: mpexample\n";
51 std::promise<mp::EventLoop*> promise;
52 std::thread loop_thread([&] {
54 promise.set_value(&loop);
59 auto [printer_init, printer_pid] =
Spawn(*loop, argv[0],
"mpprinter");
60 auto [calc_init, calc_pid] =
Spawn(*loop, argv[0],
"mpcalculator");
61 auto calc = calc_init->makeCalculator(printer_init->makePrinter());
64 std::cout <<
"Enter the equation, or \"exit\" to quit: ";
65 std::getline(std::cin, eqn);
66 if (eqn ==
"exit")
break;
67 calc->solveEquation(eqn);
75 std::cout <<
"Bye!" << std::endl;
path & append(const char *c)
static auto Spawn(mp::EventLoop &loop, const std::string &process_argv0, const std::string &new_exe_name)
std::string string() const =delete
int SpawnProcess(int &pid, FdToArgsFn &&fd_to_args)
Spawn a new process that communicates with the current process over a socket pair.
Event loop implementation.
std::string message
Message to be logged.
int main(int argc, char **argv)
Log level
The severity level of this message.
int WaitProcess(int pid)
Wait for a process to exit and return its exit code.
static void LogPrint(mp::LogMessage log_data)
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
void loop()
Run event loop.