簡體   English   中英

關閉Qt應用程序的STDIN

[英]Closing STDIN for a Qt Application

我正在一個項目中,該項目具有多個使用命名管道進行通信的C ++可執行文件。 主應用程序(App1)產生其余的應用程序。 生成時,它使用以下命令為孩子關閉STDIN

close(STDIN_FILENO);

並將STDOUTSTDERR重定向到特定於子進程的其他文件。 這樣一來,App1的輸出來自App1,而沒有子級。 它還允許App1接受來自STDIN輸入,而不讓它STDIN進程捕獲。

子進程之一是Qt應用程序。 生成時,它正在使用盡可能多的CPU,這大大降低了我的計算機的速度。 如果我沒有為子進程關閉STDIN ,則此行為會停止(但是子進程將捕獲STDIN而不是我不希望的主進程)。

為什么會發生這種情況?如何防止Qt應用程序使用所有CPU周期?

也許給Qt應用程序想要什么? fork之后但exec之前使用dup2 dup2會將給定的文件描述符替換為另一個文件描述符,因此您可以將stdin替換為文件。 快速示例:

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
}

我想我在解決另一個問題時就知道了問題所在。 在重定向STDERRSTDOUT文件描述符之前,我關閉了STDIN文件描述符。 這搞砸了我使用freopen()重定向它們時使用的索引。

重定向后,我將STDINclose()移至,似乎不再有問題了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM