我想询问是否可以在qt-application和php-script之间创建共享内存。
我环顾四周,想出了以下(非常简单)的想法:
qt - side
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
unsigned char data[5] = {1,2,3,4,5};
QSharedMemory smem;
smem.setNativeKey("12345");
qDebug() << smem.nativeKey();
if(smem.create(4096)){
qDebug() << "SharedMemory created.";
char *to = (char*)smem.data();
memcpy(to,data,5);
}
return a.exec();
}
php - side
<?php
$shm_ = shmop_open("12345", "w", 0,0);
if($shm_==FALSE){
echo "SHM Open Failed!";
}else{
$shm_s = shmop_size($shm_);
echo "SHM Open Succ! [Size : ".$shm_s."]<br>";
$data_read = shmop_read($shm_,0,5);
shmop_close($shm_);
}
?>
但这种做法失败了。 shmop_open()说:无法附加或创建共享内存。 (在windows / qt ver.5.5上运行xampp)
提前致谢!
答案 0 :(得分:2)
理论上这似乎是可能的。然而,由于不同平台的不同共享内存实现,实际上这通常不足。 Qt在其他特定于系统的API(在不同平台上有所不同)之上实现了自己的QSharedMemory
类。 PHP也可以这样做。
您需要找到两端兼容的技术。寻找最具特定于操作系统的方法,因为可能存在共同点。我不是在Linux平台上经验丰富,但是:
对于Windows平台,我发现this SO question描述了PHP中基于文件的共享内存。在Qt方面,您可以使用normal Windows API函数。两者匹配的可能性很大。
另一种方法是使用套接字。起初,使用网络堆栈进行进程间通信可能看起来有点过分,但这有两个明显的优点:
memcpy()
呼叫的开销相当。