2012-03-08 5 views
0

私は別のコンソールアプリケーションを呼び出すことができるように新しいプロセスをfork()しようとしています。firebreath npapiプラグインからfork()を発行する

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

私はちょうどサンプルプラグインプロジェクトを取って、フォークを行うようにエコーメソッドを変更しました。

通常のコンソールアプリケーションは、フォークコードで正常に動作します。

firebreathプラグインアプリで考慮しなければならないことがありますか?

誰かが問題の原因を示唆することはできますか?

プラットフォームはarchlinux 64ビットです。そこには、子プロセスからのDOMにアクセスするための方法はありませんので、htmlLogがで動作しません - 私は特定することはできませんが、私があなただったら、私はhtmlLog呼び出しを削除してみたい

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

フォークされたプロセスでそれを使用しようとすると、それを知らないブラウザプロセスと通信しようとする(失敗した)ときに、非アクティブな状態になる可能性があります。

これがうまくいくかどうかはわかりませんが、すでに何かの子プロセスであるプロセスをフォークすることについて少し神経質になります。ブラウザはプラグインプロセスを所有しており、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

関連する問題