几天以来,我一直在努力让以下事情发挥作用:
我有一个微型 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++ 程序传输到 PHP(在 wamp-server 上运行)?
PS:正如我最近在其他问题中读到的那样,似乎不可能与共享内存进行通信......我以前从未使用过命名管道,但是如何使用命名管道来实现我的问题?或者是否有更好/更快的方法来实现 C++ 和 PHP 之间的通信?