我正在尝试fork()一个新进程,以便我可以调用一个单独的控制台应用程序。
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;
}
答案 0 :(得分:1)
我无法确定,但如果我是你,我会尝试删除htmlLog调用 - 你无法从子进程访问DOM,所以htmlLog根本不会工作,它是很有可能尝试在分叉进程中使用它会导致它在尝试(不成功)与不知道它的浏览器进程通信时进入非活动状态。
我不确定这是否可以起作用,但是对于一个已经是其他事物的子过程的过程,我会有点紧张;浏览器拥有插件进程并通过IPC与它进行通信,因此如果您分叉该进程,可能会有很多代码,您不知道还在运行并尝试通过现已不存在的IPC连接与浏览器通信。
我的建议是启动一个单独的过程,但那只是我。至少,您绝对不能使用FireBreath提供的任何内容与子进程中的浏览器进行通信。