0

我正在尝试 fork() 一个新进程,以便可以调用单独的控制台应用程序。

分叉确实发生得很好,我得到了一个新的进程 ID,但进程处于睡眠状态,即使浏览器退出也不会激活。

我只是拿了示例插件项目并修改了 echo 方法来做 fork。

常规控制台应用程序可以与 fork 代码一起正常工作。

对于 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;
}
4

1 回答 1

1

我不能确定,但​​如果我是你,我会尝试删除 htmlLog 调用——你无法从子进程访问 DOM,所以 htmlLog 根本不起作用,很有可能尝试在分叉进程中使用它会导致它进入非活动状态,同时它尝试(不成功)与不知道它的浏览器进程通信。

我不确定这是否可行,但是对于分叉一个已经是其他东西的子进程的进程,我会有点紧张;浏览器拥有插件进程并通过 IPC 与其通信,因此如果您分叉该进程,可能会有很多您不知道的代码仍在运行并试图通过现已失效的 IPC 连接与浏览器通信。

我的建议是启动一个单独的过程,但这只是我。至少,您绝对不能使用 FireBreath 提供的任何东西从子进程与浏览器进行通信。

于 2012-03-08T18:05:02.460 回答