Linux程序开发:QT的内部进程通信(4)
文章作者 100test 发表时间 2007:03:14 16:41:08
来源 100Test.Com百考试题网
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". } |