因为几天我试图让以下事情发挥作用: 我有一个很小的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-manual中所述,他们说我应该为$ security和$ size设置0,如果我试图连接到现有的共享内存,但这也无效。
我怎样才能完成这个概念?我猜C ++的BaseAdress和PHP中的$ key不一样,但是 我怎么能告诉PHP然后共享内存块在哪里? 如果这不可能实现这一点:是否有另一种方法将数据从C ++程序传输到PHP(在wamp-server上运行)?
PS:正如我最近在其他问题中看到的那样,似乎无法与共享内存进行通信......我以前从未使用过命名管道,但是如何使用命名管道实现我的问题?或者是否有更好/更快的方式来启用C ++和PHP之间的通信?答案 0 :(得分:0)
我建议您使用Redis来处理C ++和PHP之间的通信。 你可以使用他的Pub / sub模块,非常强大。 http://redis.io/topics/pubsub。 您在这里有redis的客户列表:http://redis.io/clients