0

名前付きパイプを使用して通信する複数のC++実行可能ファイルがあるプロジェクトに取り組んでいます。メインアプリケーション(App1)は、残りのアプリケーションを生成します。STDINスポーンすると、以下を使用して子が閉じます。

close(STDIN_FILENO);

また、子プロセスに固有の他のファイルにリダイレクトSTDOUTします。STDERRこれにより、App1からの出力はApp1からのみになり、子は含まれなくなります。また、App1がからの入力を受け入れSTDIN、子プロセスによってキャプチャされないようにすることもできます。

子プロセスの1つは、Qtアプリケーションです。スポーンされると、可能な限り多くのCPUを使用しているため、コンピューターの速度が大幅に低下します。子プロセスを閉じないとSTDIN、この動作は停止します(ただし、STDINメインプロセスの代わりに子がキャプチャします。これは望ましくありません)。

なぜこれが発生し、QtアプリケーションがすべてのCPUサイクルを使用しないようにするにはどうすればよいですか?

4

2 に答える 2

0

たぶん、Qtアプリに必要なものを提供しますか?dup2fork、前に使用しexecますか?dup2stdinをファイルに置き換えることができるように、指定されたファイル記述子を別の記述子に置き換えます。簡単な例:

if(fork() == 0)
{
   int somefd = open("somefile", O_RDONLY);
   // replace stdin (0) with somefd before exec-ing
   if(dup2(somefd, 0) == -1)
   {
      // cunning plan failed
   }
   // exec Qt app here
}
于 2012-05-23T15:43:49.100 に答える
0

私が抱えていた別の問題を修正しながら、問題が何であるかを理解したと思います。およびファイル記述子STDINをリダイレクトする前に、ファイル記述子を閉じていました。これは、リダイレクトに使用したときに使用されていたインデックスを台無しにしていました。STDERRSTDOUTfreopen()

close()リダイレクト後にのをに移動しましたSTDINが、もう問題はないようです。

于 2012-05-23T15:55:48.520 に答える