最近几天,我一直在尝试让以下事情正常工作: 我有一个小的C++程序,它不断地从串口读取一些数据。 这些数据会以以下方式存储到共享内存中:
HANDLE hMapFile;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
10,
NULL);
LPCTSTR pBuf;
pBuf = (LPTSTR) MapViewOfFileEx(
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
10,
NULL);
while(true)
{
//... some code ...
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
//... some code ...
}
现在我想使用PHP访问此共享内存。所以我尝试了以下操作:
$shm_id = shmop_open($key, $mode, $security, $size);
$read = shmop_read($shm_id, 0, 10);
//... some code ...
但我不知道应该设置哪个键,模式,安全性和大小!
在你写任何东西之前: 我使用“MapViewOfFileEx()”,因为我想设置一个固定的地址,以便PHP可以从固定的地址读取。 我也尝试了在C++和PHP中都将其设置为“0x00030000”。 C ++能够创建FileMapping,但PHP无法访问,会给出错误消息:shmop_open():无法附加或创建共享内存段。 对于$mode,我设置了“a”仅用于读取权限。 对于$security,我设置了所有权限的0777... 对于$size,我设置了10字节。
就像在PHP手册中所写的那样,如果我想要连接到现有的共享内存,则应将$security和$size都设置为0,但这也不起作用。
我该如何完成这个概念?我猜C ++的BaseAdress与PHP中的$key不同,但是我怎样才能告诉PHP共享内存块在哪里? 如果这不可能实现:是否有另一种方法可以将数据从C ++程序传输到运行在Wamp服务器上的PHP? PS:正如我最近在其他问题中阅读的那样,似乎无法与共享内存通信...我以前从未使用过命名管道,但是如果使用命名管道,我的问题将如何得到解决?或者是否有更好/更快速的方法可以使C ++和PHP之间进行通信?
dio
扩展来直接访问串口。我们在PHP中创建了许多命令行和守护程序解决方案,其中一些正在与GSM调制解调器实时通信 - 一切都完美地运作,并且没有消耗太多资源。 - mlask