1<?xml version="1.0" standalone="yes"?> 2<programlisting> 3for (auto & s : seq) 4 s.<methodname alt="boost::process::extend::handler::on_setup">on_setup</methodname>(*this); 5 6if (<methodname alt="boost::process::extend::posix_executor::error">error</methodname>()) 7{ 8 for (auto & s : seq) 9 s.<methodname alt="boost::process::extend::handler::on_error">on_error</methodname>(*this, <methodname alt="boost::process::extend::posix_executor::error">error</methodname>()); 10 return <classname alt="boost::process::child">child</classname>(); 11} 12 13pid = <ulink url="http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html">fork()</ulink> 14<methodname alt="boost::process::extend::handler::on_setup">on_setup</methodname>(*this); 15 16if (pid == -1) //fork error 17{ 18 <methodname alt="boost::process::extend::posix_executor::set_error">set_error</methodname>(<functionname alt="boost::process::extend::get_last_error">get_last_error</functionname>()); 19 for (auto & s : seq) 20 s.<methodname alt="boost::process::extend::handler::on_fork_error">on_fork_error</methodname>(*this, <methodname alt="boost::process::extend::posix_executor::error">error</methodname>()); 21 for (auto & s : seq) 22 s.<methodname alt="boost::process::extend::handler::on_error">on_error</methodname>(*this, <methodname alt="boost::process::extend::posix_executor::error">error</methodname>()); 23 return <classname alt="boost::process::child">child</classname>() 24} 25else if (pid == 0) //child process 26{ 27 for (auto & s : seq) 28 s.<methodname alt="boost::process::extend::handler::on_exec_setup">on_exec_setup</methodname>(*this); 29 <ulink url="http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html">execve</ulink>(exe, cmd_line, env); 30 auto ec = <functionname alt="boost::process::extend::get_last_error">get_last_error</functionname>(); 31 for (auto & s : seq) 32 s.<methodname alt="boost::process::extend::handler::on_exec_error">on_exec_error</methodname>(*this); 33 34 <emphasis>unspecified();</emphasis>//here the error is send to the father process interally 35 36 <ulink url="http://en.cppreference.com/w/cpp/utility/program/exit">std::exit</ulink>(<ulink url="http://en.cppreference.com/w/c/program/EXIT_status">EXIT_FAILURE</ulink>); 37 return <classname alt="boost::process::child">child</classname>(); //for C++ compliance 38} 39 40<classname alt="boost::process::child">child</classname> c(pid, exit_code); 41 42<emphasis>unspecified();</emphasis>//here, we read the the error from the child process 43 44if (<methodname alt="boost::process::extend::posix_executor::error">error</methodname>()) 45 for (auto & s : seq) 46 s.<methodname alt="boost::process::extend::handler::on_error">on_error</methodname>(*this, <methodname alt="boost::process::extend::posix_executor::error">error</methodname>()); 47else 48 for (auto & s : seq) 49 s.<methodname alt="boost::process::extend::handler::on_error">on_success</methodname>(*this); 50 51//now we check again, because a on_success handler might've errored. 52if (<methodname alt="boost::process::extend::posix_executor::error">error</methodname>()) 53{ 54 for (auto & s : seq) 55 s.<methodname alt="boost::process::extend::handler::on_error">on_error</methodname>(*this, <methodname alt="boost::process::extend::posix_executor::error">error</methodname>()); 56 return <classname alt="boost::process::child">child</classname>(); 57} 58else 59 return c; 60</programlisting>