当使用QProcess由另一个人打开应用程序时,正在阻止使用read()读取STDIN

时间:2015-03-12 13:50:25

标签: c qt stdin nonblocking qprocess

我有以下情况:两个应用程序,“接口”(Qt)和“中心”(C),作为嵌入式Linux解决方案的一部分一起工作,主要通过套接字进行通信。 “接口”启动“中心”,必须能够向其发送“关闭”命令。 “中心”有一个主事件循环,如果“接口”发送“关闭”命令,它应该不断读取。

首先,我将system("./center&")称为“中心”,我将以下列方式使用read()

char readBuffer[10];
memset(readBuffer,'\0',sizeof(char) * 10);

read(STDIN_FILENO, readBuffer, 10);

if (strcmp(readBuffer, "close") == 0)
{
     DEBUG_MAIN("CENTER: Closing center normally");
     break;
}

(这位于while(true)中的main()循环内。)

问题是这种方式“接口”无法直接与“中心”通信 - 我只能使用套接字系统。这样可以正常工作,但似乎它有一些缺点:套接字是从另一个线程读取的,所以我必须创建互斥等,以便不断在main()内看到一个bool标志,这对病人的调用 - 修改system等。

所以我决定用QProcess调用“Center”,这会给我一些日志记录优势,我会采用传统的QProcess方式与该应用程序进行通信,即用write()写入stdin。

所以我确实成功实现了QProcess,一切正常,但现在上面用read()复制的代码变成了阻塞的代码:当用system()调用“Center”时,代码会通过那部分注意到STDIN中没有任何内容可供阅读。现在我使用QProcess调用Centerread()以阻塞方式运行。


所以我的第一个(也是具体的)问题是:为什么read()在以“{1}}启动”中心时以非阻塞方式运行,但在使用QProcess启动时阻塞?

第二个(通用)问题是:如何以非阻塞方式从STDIN读取?我之前已经做过这项研究(example of results)和AFAIR上面的代码就是我这样做的解决方案;这就是我使用它的原因。


回答第二个问题:以非阻塞的方式读取STDIN,只需写

system()

Reference

0 个答案:

没有答案