проблема с fork () из плагина firebreath npapi - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь раскошелиться () на новый процесс, чтобы я мог вызвать отдельное консольное приложение.

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

Я просто взял пример проекта плагина и изменил метод echo, чтобы сделать ответвление.

Обычное консольное приложение отлично работает с кодом форка.

Есть ли что-то другое, что нужно учитывать для приложения плагина Firebreath?

Может кто-нибудь подсказать, в чем может быть проблема?

Платформа является archlinux 64 бит.

FB::variant PluginTestVZAPI::echo(const FB::variant& msg)
{
    static int n(0);
    fire_echo("So far, you clicked this many times: ", n++);

    // fork
    pid_t pid = fork();
    if(pid == 0) // Child
    {
        m_host->htmlLog("child process");
    }
    else if (pid < 0) // Failed to fork
    {
        m_host->htmlLog("Failed to fork");
        m_host->htmlLog(boost::lexical_cast<std::string>(pid));
    }
    else // Parent
    {
        m_host->htmlLog("Parent process");
    }
    m_host->htmlLog("Child Process PID = " + boost::lexical_cast<std::string>(pid));
    // end fork

    // return "foobar";
    return msg;
}

1 Ответ

1 голос
/ 08 марта 2012

Не могу быть уверен, но на вашем месте я бы попытался удалить вызовы htmlLog - у вас нет возможности получить доступ к DOM из дочернего процесса, поэтому htmlLog не будет работать вообще, и этовполне возможно, что попытка использовать его в разветвленном процессе приводит к тому, что он переходит в неактивное состояние, в то время как он пытается (безуспешно) связаться с процессом браузера, который не знает об этом.

Я не знаюзнаю наверняка, может ли это сработать или нет, но я бы более чем нервничал по поводу создания процесса, который уже является дочерним процессом чего-то другого;браузер владеет процессом плагина и связывается с ним через IPC, поэтому, если вы разветвляете этот процесс, может быть много кода, о котором вы не знаете, и который все еще работает и пытается общаться с браузером через уже не существующее соединение IPC.

Я бы порекомендовал запустить отдельный процесс, но это только я.По крайней мере, вы абсолютно не можете использовать что-либо, что FireBreath предоставляет для связи с браузером из дочернего процесса.

...