Boost.Process - как заставить процесс запустить функцию? - PullRequest
3 голосов
/ 23 января 2011

Поэтому я пытаюсь что-то сделать с Boost.Process , хотя это еще не было принято в дистрибутив Boost.

самая простая программа будет выглядеть как

#include <boost/process.hpp> 
#include <string> 
#include <vector> 

namespace bp = ::boost::process; 

void Hello()
{
    //... contents does not matter for me now - I just want to make a new process running this function using 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::silence_stream(); 

    return bp::launch(exec, args, ctx); 
} 

int main() 
{ 
    bp::child c = start_child(); 

    bp::status s = c.wait(); 

    return s.exited() ? s.exit_status() : EXIT_FAILURE; 
} 

как завершить процесс, который я создаю для выполнения функции Hello ()?

1 Ответ

7 голосов
/ 23 января 2011

Вы не можете.Другой процесс - другой исполняемый файл.Если вы не породили еще один экземпляр той же программы, дочерний процесс даже не будет содержать функцию Hello ().

Если дочерний процесс является другим экземпляром вашей программы, вам нужно определить свой собственный способ сообщить ребенкузапустить Hello ().Это могут быть аргументы процесса или некоторый протокол в std: cin (то есть использование стандартного ввода для межпроцессного взаимодействия)

На платформе UNIX / Linux вы можете запустить другой процесс и НЕ запускать другой исполняемый файл.Смотрите системный вызов fork (2).Затем вы можете вызвать Hello () у ребенка.Но boost :: process: launch (9 сопоставляется с fork + exec на таких платформах. Обычный fork () не предоставляется boost, например, потому что его нет на других платформах.

Может быть крайнезависимые от платформы способы делать то, что вы хотите, но вы не хотите туда идти.

...