QDataStream не инициализируется при чтении буфера из файлового дескриптора ipc fifo - PullRequest
0 голосов
/ 02 марта 2019

Я хочу установить связь между двумя приложениями с помощью fifo (ipc). Я создал fifo с помощью команды "mkfifo MyPipe".

первое приложение:

....
....
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 Ответ

0 голосов
/ 07 марта 2019

Это было решено с помощью промежуточного беззнакового буфера символов для инициализации 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;

}
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...