2009-06-08 12 views
6

私は別のプロセスで実行する必要があるので、クラッシュする傾向のあるコードを実行する必要があります。Qt4アプリケーションでは "fork()"への移植可能な方法はありますか?

pid = fork(); 
    if (pid == -1) { 
    std::cout << "Cant Spawn New Thread"; 
    exit(0); 
    } else if (pid == 0) { 
    std::cout << "Im a child that will crash\n"; 
    char *foo = (char *) 0xffff; 
    std::cout << foo; 
    exit(0); 
    } else { 
    std::cout << "PID: " << pid << "\n"; 
    } 
    do { 
    std::cout << "Waiting for " << pid << " to finish .. \n"; 
    pid_w = waitpid(pid,&status,0); 
    } while (pid_w == -1); 

明らかに頼ることなく、私はちょうど私のQt4をアプリケーションにフォークを使用することができますが、私はQt4版が提供する任意のものまたは任意のポータブルな方法で同じ機能をアーカイブすることができる場合、私は思ったんだけど:一般的に私はこのようにそれを行うだろうアーキテクチャの束を持って#ifdefs

いずれにしても、私はpthread実装しか持たないようにこのアプリをターゲットしていますが、できるだけ "ネイティブ" Qt APIに近いものにしたいと考えています。

私はQThreadをテストしましたが、スレッド内のsegfaultがアプリケーション全体をクラッシュさせることは明らかでした。完全に異なる実行ファイルを作成する場合にのみQProcessが使用されるように見えます。他の選択肢はありますか?

+3

http://qtcentre.orgにQtフォーラムがありますか? irc.freenode.netの#qt channelで質問することもできます。あなたが答えを得られない場合に備えてください。 –

+0

私はqtcentreのwikiから可能な例を検索しようとしましたが、何も見つからなかったので、今度は#qtで後でpropably =) – rasjani

答えて

7

Windowsのフラットアウトには公然と消耗する方法でfork()がありません。そのため、Qtを呼び出すことはできません。特別なコマンドラインパラメータなどで自分自身を始めるようなことをする必要があります。

+0

Windowsでは 'fork()'をエミュレートする方法があることに注意してください。 Cygwinはそれを行います。しかし、それは非常に複雑で遅いです(メモリ全体をコピーするだけです)。したがって、おそらく、コードを特別なヘルパーアプリケーションに移動して、サブプロセスで実行できるようにすることをお勧めします。または、特別なコマンドラインパラメータを指定して同じアプリを起動することもできます。 – Albert

1

試してみましたか... catchステートメント&クラッシュを回避する方法を理解していますか?

+1

申し訳ありませんが、オプションではなく、クラッシュするコード*私のアプリケーションはちょうどそれをキャッチし、ちょうどそれ自体をクラッシュせずに間違いをしないでください。 – rasjani

+2

AVを捕まえて呑み込むことは大規模なセキュリティ脆弱性です –

3

QtConcurrentは、Qtで利用可能なマルチスレッドプログラミングのための最も高度なAPIであると思います。あなたのコードはよりシンプルでクリーンになります。
これは高レベルのAPIなので、既に試した低レベルのAPIの上に実装されている可能性がありますが、おそらく問題は解決しない可能性があります。

0

QThreadもお試しください。 QtConcurrentよりも古く、おそらくあまり便利ではありません。 CPU上のコア数が自動的に調整されないため、負荷が均等に分散されません。それでも、drop-inの代替ではありませんが、おそらくfork()に最も近いQtアナログです。どちらもQThreadであり、QtConcurrentはプラットフォーム間で移植可能です。

関連する問題