2012-03-08 1 views
0

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

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

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

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

Есть ли что-то другое, что нужно учитывать для приложения плагинов для 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; 
} 
+0

Не разрешайте процесс, которому вы не владеете, и не знаете всего; я удивлен, что он не сработает сразу. Помните, что ваш код просто гость в браузере или процессе плагина. –

+0

Поиск через stackoverflow и, в общем, метод запуска нового процесса, похоже, использует fork. Каким будет способ запуска процесса без использования вилки? – csaket

ответ

1

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

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

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

+0

Я пошел по пути fork(), поскольку это, казалось, единственный способ получить новый процесс. Перейдите по http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16, чтобы иметь возможность запускать в качестве демона. Но он использует вилку для начала. fork, setsid, fork, chdir, umask, close. Есть ли другой способ запустить новый процесс? – csaket

+1

это, безусловно, * не * единственный способ получить новый процесс; существует множество системных API, которые запустили дочерний процесс. Вам просто нужно создать другой исполняемый файл для запуска с ним и определить, какой IPC вы хотите использовать – taxilian