[英]Closing STDIN for a Qt Application
我正在一個項目中,該項目具有多個使用命名管道進行通信的C ++可執行文件。 主應用程序(App1)產生其余的應用程序。 生成時,它使用以下命令為孩子關閉STDIN
:
close(STDIN_FILENO);
並將STDOUT
和STDERR
重定向到特定於子進程的其他文件。 這樣一來,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
}
我想我在解決另一個問題時就知道了問題所在。 在重定向STDERR
和STDOUT
文件描述符之前,我關閉了STDIN
文件描述符。 這搞砸了我使用freopen()
重定向它們時使用的索引。
重定向后,我將STDIN
的close()
移至,似乎不再有問題了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.