我有以下情况:两个应用程序,“接口”(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调用Center
,read()
以阻塞方式运行。
所以我的第一个(也是具体的)问题是:为什么read()
在以“{1}}启动”中心时以非阻塞方式运行,但在使用QProcess启动时阻塞?
第二个(通用)问题是:如何以非阻塞方式从STDIN读取?我之前已经做过这项研究(example of results)和AFAIR上面的代码就是我这样做的解决方案;这就是我使用它的原因。
回答第二个问题:以非阻塞的方式读取STDIN,只需写
system()