PHP/C++;:共享内存时发生shm_open()错误

PHP/C++;:共享内存时发生shm_open()错误,php,c++,linux,shared-memory,lighttpd,Php,C++,Linux,Shared Memory,Lighttpd,我一直在互联网上寻找我问题的答案。这是安装程序,我正在运行嵌入式Linux(使用Yocto创建),它正在运行带有PHP5的Lighttpd web服务器。在我的C++代码中,我有以下的内容: shared = shm_open(SHARED_FILE_NAME, O_RDWR | O_CREAT | O_TRUNC, 0666); ftruncate(shared, FILE_SIZE); map = mmap(...); // shm_unlink() isn't called until m

我一直在互联网上寻找我问题的答案。这是安装程序,我正在运行嵌入式Linux(使用Yocto创建),它正在运行带有PHP5的Lighttpd web服务器。在我的C++代码中,我有以下的内容:

shared = shm_open(SHARED_FILE_NAME, O_RDWR | O_CREAT | O_TRUNC, 0666);
ftruncate(shared, FILE_SIZE);
map = mmap(...);
// shm_unlink() isn't called until my C++ thread ends.

一切都很好,我没有任何错误,其他C++进程和线程也可以访问共享内存和映射而没有任何问题(我有一个写入线程,所有其他线程和进程只在内存上读取)。内存用作环形缓冲区,其中写入线程正在非常快速地更新数据。在PHP中尝试访问相同的内存时,问题开始出现。在PHP中,我需要(需要只读):

我已使用
chmod 777/dev/shm/shared.shm
更改了文件的权限,以排除任何文件权限问题。此外,当我运行<代码> IPCS- M< /Cord>我没有得到共享内存段的任何列表,但是我的C++代码运行正常。我还查找了SELinux并尝试输入
setEnforce0
,但得到的响应是
-sh:setEnforced:command not found
,因此我认为这不是问题。我还试着运行
wget/shared.php
,看看在本地运行是否会返回正确的数据,但是当查看返回的文件时,它有相同的错误消息。
我希望能够让我的嵌入式系统上的网页读取这个共享内存,并在收到请求时将二进制数据块流回给图形(当时对web套接字不感兴趣)。我能让命名管道在PHP和C++之间工作,但我需要共享内存,这对内存应用来说似乎很麻烦。非常感谢您的帮助。

我正在开发需要使用C共享内存的PHP函数。作为您的代码,MyC函数使用shm_open、mmap等。。我想应该使用PHP ftok(),shmop_open()来访问C的共享内存,但是这个PHP函数不起作用。
这两个区域不兼容。我在本文档中发现了两个区域的不同属性:

  • C(在shm_打开、mmap和Straton源代码一样)使用“POSIX共享内存”
  • PHP(带有shmop_*函数)使用“SystemV共享内存”

我建议您尝试使用Sync:您需要PECL Sync扩展。

我正在开发需要使用C共享内存的PHP函数。作为您的代码,MyC函数使用shm_open、mmap等。。我想应该使用PHP ftok(),shmop_open()来访问C的共享内存,但是这个PHP函数不起作用。
这两个区域不兼容。我在本文档中发现了两个区域的不同属性:

  • C(在shm_打开、mmap和Straton源代码一样)使用“POSIX共享内存”
  • PHP(带有shmop_*函数)使用“SystemV共享内存”

我建议您尝试使用Sync:您需要PECL Sync扩展。

strace the PHP,看看底层shm_open()库调用的errno结果是什么。作为旁白:请从这个问题中删除“lighttpd”标签。以创建共享内存段的同一用户的身份测试您的代码,以查看可能通过lighttpd运行PHP的不同用户的权限错误。如果是,请尝试在C++中使用FCHMODE()以在创建共享内存段后设置权限。(顺便说一下,用‘^’来启动变量是禁止C++的。你不是编译器、标准库或内核),当查阅<代码> fCHMODE()/<代码>文档时,它和我从上面输入<代码> CHMOD 777…< /代码>时一样。我还能够使用PHP的
fopen()
fread()
fclose()
而没有任何访问错误,并且它发现共享内存文件很好。除了我在上面发布的
警告:…
之外,我不知道如何在PHP中进一步追踪。我还尝试以root用户身份运行Lighttpd,但这需要对Lighttpd的代码进行重新编译(目前无法访问)。并检查ftok()的(整数)返回值。它是否与C++中创建的共享内存段匹配?Tr在PHP的ftok()中使用“”而不是“c”。+gstrauss:在我的帖子中,我声明
ftok()
不会返回
-1
,这意味着它没有失败。我还提到,当使用命令
ipcs-m
时,我没有列出任何段,但我可以从C/C++代码中访问共享内存。请浏览PHP,查看底层shm_open()库调用的errno结果。作为旁白:请从这个问题中删除“lighttpd”标签。以创建共享内存段的同一用户的身份测试您的代码,以查看可能通过lighttpd运行PHP的不同用户的权限错误。如果是,请尝试在C++中使用FCHMODE()以在创建共享内存段后设置权限。(顺便说一下,用‘^’来启动变量是禁止C++的。你不是编译器、标准库或内核),当查阅<代码> fCHMODE()/<代码>文档时,它和我从上面输入<代码> CHMOD 777…< /代码>时一样。我还能够使用PHP的
fopen()
fread()
fclose()
而没有任何访问错误,并且它发现共享内存文件很好。除了我在上面发布的
警告:…
之外,我不知道如何在PHP中进一步追踪。我还尝试以root用户身份运行Lighttpd,但这需要对Lighttpd的代码进行重新编译(目前无法访问)。并检查ftok()的(整数)返回值。它是否与C++中创建的共享内存段匹配?Tr在PHP的ftok()中使用“”而不是“c”。+gstrauss:在我的帖子中,我声明
ftok()
不会返回
-1
,这意味着它没有失败。我还提到,当使用命令
ipcs-m
时,我没有列出任何段,但我可以从C/C访问共享内存++
<?php
$shm_key = ftok("/dev/shm/shared_file.shm", 'c');
$shm_id = shm_open($shm_key, "a", 0, 0);
...
?>
Warning: shmop_open(): unable to attach or create shared memory segment in /www/pages/shared.php on line 9