0

我正在开发一个项目,该项目具有多个使用命名管道进行通信的 C++ 可执行文件。主应用程序 (App1) 产生其余的应用程序。STDIN产卵时,它会为孩子们关闭:

close(STDIN_FILENO);

它会重定向STDOUTSTDERR特定于子进程的其他文件。这使得 App1 的输出来自 App1 而没有子级。它还允许 App1 接受来自STDIN子进程的输入,而不是让它被子进程捕获。

其中一个子进程是 Qt 应用程序。生成时,它会使用尽可能多的 CPU,从而大大降低了我的计算机速度。如果我不关闭STDIN子进程,则此行为停止(但子进程捕获STDIN而不是主进程,这是我不想要的)。

为什么会发生这种情况,如何防止 Qt 应用程序使用所有 CPU 周期?

4

2 回答 2

0

我想我在解决我遇到的另一个问题时弄清楚了问题所在。STDIN在重定向STDERR和文件描述符之前,我正在关闭STDOUT文件描述符。这弄乱了我用来freopen()重定向它们时使用的索引。

重定向后我将close()of移至STDIN,似乎不再有问题了。

于 2012-05-23T15:55:48.520 回答
0

也许给 Qt 应用程序它想要的东西?dup2之后fork但之前使用execdup2将用另一个文件描述符替换给定的文件描述符,以便您可以用文件替换标准输入。快速示例:

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 回答