3、 FIFO机制
当然,除了 Qt 内部所特有的通信机制之外,一般操作系统中常用的进程间通信机制同样可以用于 Qt 系统内部不同进程之间的通信。如消息队列、共享内存、信号量、管道等机制,其中有些机制,如信号量,在 Qt 中重新进行了封装;有些机制则可以直接调用操作系统的系统调用来实现。这里,有名管道是一种简单实用的通信机制,用户在对Qt内部机制
不甚了解的情况下,同样可以使用这种方法实现对象进程之间的通信。下面就对利用这种机制实现Qt内部进程之间的通信过程进行介绍。
首先,需要创建 FIFO,这个过程类似于创建文件,在系统中可以利用 mkfifo 命令来创建,这样就可以用 open 函数打开它,同时,一般的文件 I/O函数(close、read、write)都可以用于 FIFO。
在基于 Qt 的应用中,有很多应用采用了一种客户机-服务器模式,这时就可以利用 FIFO 在客户机和服务器之间传递数据。例如,有一个服务器,它负责接收底层程序发来的消息,同时,它与很多客户机有关,服务器需要将收到的不同消息发送到不同的客户机,而每个客户机也有请求需要发给服务器,进而发给底层程序。
下面是服务器端的程序示例:(架设已有客户端进程为读而打开/dev/fifoclient1和/dev/fifoclient1)
fd = open("/dev/fifoserver", O_NONBLOCK|O_RDONLY);
file = fdopen(fd, "r");
ret = fgets(buf, MAX_LINE, file );
if(buf[0] == '0')
{
QFile fd_file("/dev/fifoclient1");
QString temp(buf);
if(fd_file.open(IO_WriteOnly|IO_Append)) {
QTextStream t(&fd_file);
t<< temp;
fd_file.close();
}
else if(buf[0] == '1')
{
QFile fd_file("/dev/fifoclient2");
QString temp(buf);
if(fd_file.open(IO_WriteOnly|IO_Append)) {
QTextStream t(&fd_file);
t<< temp;
fd_file.close();
}
……
在该程序中,服务器接收底层发来的信息(这里假设也是由 FIFO 管道传来),然后根据收到的信息内容,如第一个字节的内容,将信息发到不同客户端的管道中,实现对信息的正确分发。
客户端程序示例如下:(假设服务器端已经为读而打开 /dev/fifo 管道)
QFile out_file("/dev/fifo");
if(out_file.open(IO_WriteOnly|IO_Append)) {
QTextStream t(&out_file);
t << text << "\n"; }
友情提示:如果您对北大青鸟的学费、课程、就业有疑问,可以点击此处留言,或拨打电话:020-34330086,我们会有专业课程顾问细心为你解答问题,免费为你定身做前景分析和职业规划!