从 ipc fifo 文件描述符读取缓冲区时未初始化 QDataStream
Posted
技术标签:
【中文标题】从 ipc fifo 文件描述符读取缓冲区时未初始化 QDataStream【英文标题】:QDataStream not initialized while reading buffer from ipc fifo file descriptor 【发布时间】:2019-03-02 16:28:51 【问题描述】:我想使用fifo(ipc)在两个应用程序之间进行通信,我通过“mkfifo MyPipe”命令创建了一个fifo。
第一个应用程序:
....
....
fd = open("MyPipe", O_NONBLOCK | O_WRONLY);
QByteArray buf;
QDataStream bdwr(&buf,QIODevice::WriteOnly);
bdwr.setVersion(kDSVersion);
myclassObjWr.lname = "AAAAA";
myclassObjWr.fname = "BBBBB";
bdwr << myclassObjWr.lname << myclassObjWr.fname ;
ssize_t written = write(fd,buf.data() , buf.length());
.....
.....
第二个应用:
....
....
fd = open("MyPipe", O_NONBLOCK | O_RDONLY);
ssize_t nread;
QByteArray rxbuf;
static const QDataStream::Version kDSVersion = QDataStream::Qt_5_12;
QDataStream bdrd(&rxbuf, QIODevice::ReadWrite);
bdrd.setVersion(kDSVersion);
nread = read(fd, rxbuf.data(),200);
if ( nread > 0)
bdrd.writeRawData(rxbuf.data(),nread);
bdrd >> myclassObjrd.lname >> myclassObjrd.fname;
qDebug() << "lname: " << myclassObjrd.lname;
....
....
读取 ipc fifo 后,“rxbuf”已完全初始化,但“myclassObjrd.lname”和“myclassObjrd.fname”均为空且未初始化。
【问题讨论】:
【参考方案1】:通过使用中间无符号字符缓冲区来初始化第二个应用程序中的QByteArray,如下所示。
# ...
ssize_t nread;
QByteArray buf;
unsigned char* rxbuf;
static const QDataStream::Version kDSVersion = QDataStream::Qt_5_12;
QDataStream bdrd(&buf, QIODevice::ReadOnly);
bdrd.setVersion(kDSVersion);
rxbuf = (unsigned char*)malloc(200);
nread = read(fd, rxbuf,200);
if ( nread > 0)
for (int i = 0 ; i < nread; i++)
buf[i] = rxbuf[i] ; //init QByteArray
bdrd >> myclassObjrd.lname >> myclassObjrd.fname;
qDebug() << "lname: " << myclassObjrd.lname;
# ...
【讨论】:
以上是关于从 ipc fifo 文件描述符读取缓冲区时未初始化 QDataStream的主要内容,如果未能解决你的问题,请参考以下文章