繁体   English   中英

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

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

我一直在互联网上寻找问题的答案。 这是设置,我正在运行嵌入式Linux(使用Yocto创建),该Linux使用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 ++进程和线程也能够访问共享内存并映射而没有任何问题(我有一个writer线程,所有其他线程和进程都对内存进行只读操作)。 内存用作环形缓冲区,其中写入线程可以非常快速地更新数据。 当尝试在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的响应,所以我-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共享内存”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM