PHP / C++:共享内存时出现shm_open()错误
PHP / C++: shm_open() error when sharing memory
我一直在互联网上寻找我问题的答案。这是设置,我正在运行嵌入式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
以查看在本地运行是否会返回正确的数据,但是在查看返回的文件时,它有相同的错误消息。
我正在开发需要使用 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同步扩展。
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- POSIX open() 挂在 SMB 共享上
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- Visual Studio "fatal error LNK1104: cannot open file"未使用或包含的库
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- VS 2017 C++ - "cannot open source file 'sqlite3.h' "
- 在VS 15.7.5中,悬停在Open CV 3.4.1Mat上仍然冻结
- 计算着色器Open GL ES的多个输入
- 从生成文件编译错误:"Unable to open output file" ..."No such file or directory"
- Open GL ES 3.1 的计算着色器的最小工作示例
- 在 c++ 中写入 IPC SHM 时无法读取完整的字符串
- 我可以对"int 文件 = open(path, flag);"做点什么吗?
- 进口。TLB文件给出"cannot open source file x.tlh"
- QtCreator 中的"Fatal Error C1083: Cannot open include file"
- OpenCV: fs.open fails
- Open AL 的函数在 ubuntu 中使用 g++ 编译时给出未定义引用的错误
- 标准::Ofstream Open的Klocwork问题
- Open() 用于创建文件和打开现有文件.有人能分辨出其中的区别
- 成功使用CMakeLists制作后如何修复"open: No such file or directory"错误(该文件实际上存在)