PHP / C++:共享内存时出现shm_open()错误

PHP / C++: shm_open() error when sharing memory

本文关键字:shm open 错误 C++ 共享 内存 PHP      更新时间:2023-10-16

我一直在互联网上寻找我问题的答案。这是设置,我正在运行嵌入式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中,我这样做(需要只读(:

<?php
$shm_key = ftok("/dev/shm/shared_file.shm", 'c');
$shm_id = shm_open($shm_key, "a", 0, 0);
...
?>

当查看ftok()的值时,它返回一个非-1数字,这意味着它没有失败。我确实在PHP的shm_open()调用中失败,内容如下:

Warning: shmop_open(): unable to attach or create shared memory segment in /www/pages/shared.php on line 9

我用chmod 777 /dev/shm/shared.shm更改了文件的权限,只是为了排除任何文件权限问题。同样,当我运行ipcs -m时,我没有获得共享内存段的任何列表,但我的C++代码运行良好。我也在寻找 SELinux 并尝试输入setenforce 0但我得到了-sh: setenforce: command not found的回复,所以我认为这不是问题。我还尝试运行wget <local ip address>/shared.php以查看在本地运行是否会返回正确的数据,但是在查看返回的文件时,它有相同的错误消息。

我希望能够在我的嵌入式系统上有一个网页读取这个共享内存,并在请求进来时流回二进制块以提供图形(当时对 Web 套接字不感兴趣(。我能够让命名管道在 PHP 中工作,C++很好,但我需要此应用程序的共享内存,并且共享内存访问似乎很麻烦。任何帮助,不胜感激。

我正在开发需要使用 C 共享内存的 PHP 函数。作为你的代码,我的 C 函数使用 shm_open、mmap 等。我想使用 PHP ftok((、shmop_open(( 来访问 C 的共享内存,但这个 PHP 函数不起作用。
这两个区域不兼容。我在此文档中发现了两个区域的不同属性 http://menehune.opt.wfu.edu/Kokua/More_SGI/007-2478-008/sgi_html/ch03.html:

  • C(使用shm_open,mmap,如Straton源代码(使用"POSIX共享内存">
  • PHP(带shmop_*函数(使用"System V 共享内存">

我建议您尝试使用同步 http://php.net/manual/en/book.sync.php:您需要PECL同步扩展。