[英]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
以查看是否在本地运行将返回正确的数据,但是当查看返回的文件时,它具有相同的错误消息。
我正在开发需要使用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中找到了这两个区域的不同属性:
我建议您尝试使用Sync http://php.net/manual/en/book.sync.php :您需要PECL同步扩展名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.