0

別のコンソール アプリケーションを呼び出せるように、新しいプロセスを fork() しようとしています。

フォークは正常に行われ、新しいプロセス ID を取得しますが、プロセスはスリープ状態にあり、ブラウザーが終了してもまったくアクティブになりません。

サンプル プラグイン プロジェクトを使用し、echo メソッドを変更して 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 はまったく機能しません。フォークされたプロセスで使用しようとすると、それを認識していないブラウザー プロセスとの通信を (失敗して) 試みている間、非アクティブな状態になります。

これが機能するかどうかは定かではありませんが、すでに他の何かの子プロセスであるプロセスを fork することについては、少し神経質になります。ブラウザはプラグイン プロセスを所有し、IPC 経由で通信します。そのため、そのプロセスをフォークすると、まだ実行中であることを知らない多くのコードが存在し、現在は機能していない IPC 接続を介してブラウザと通信しようとしている可能性があります。

別のプロセスを開始することをお勧めしますが、それは私だけです。少なくとも、子プロセスからブラウザと通信するために FireBreath が提供するものは絶対に使用できません。

于 2012-03-08T18:05:02.460 に答える