私は自分の問題の答えを探しています。ここで設定は、PHP5でLighttpd Webサーバーを実行している組み込みLinux(Yoctoで作成)を実行しています。私のC++のコードでは、私は以下があります。PHP/C++:メモリ共有時にshm_open()エラーが発生しました。
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++のプロセスとスレッドも何の問題もなく、共有メモリにアクセスし、マッピングすることができます(私は1人のライターを持っていますスレッドおよび他のすべてのスレッドおよびプロセスはメモリ上でのみ読み取りを行います)。メモリは、書き込みスレッドがデータを非常に迅速に更新しているリングバッファとして使用されます。 PHPで同じメモリにアクセスしようとすると、問題が発生し始めます。 PHPで私は(読み取り専用必要が)ん:ftok()
から値を見てみると
<?php
$shm_key = ftok("/dev/shm/shared_file.shm", 'c');
$shm_id = shm_open($shm_key, "a", 0, 0);
...
?>
それが失敗しなかったこと以外-1
数を返します。私は任意のファイル権限の問題を除外するためにchmod 777 /dev/shm/shared.shm
でファイルのパーミッションを変更した
Warning: shmop_open(): unable to attach or create shared memory segment in /www/pages/shared.php on line 9
:私は読み込みPHPのshm_open()
の呼び出しに失敗入手できますか。また、私がipcs -m
を実行すると、私は共有メモリセグメントのリストを取得しませんが、私のC++コードは正常に動作しています。私もSELinuxを探してsetenforce 0
と入力しようとしましたが、私は-sh: setenforce: command not found
という応答を得ていますので、これは問題ではないと思います。私はまたwget <local ip address>/shared.php
を実行して、ローカルで実行すると正しいデータを返すかどうかを確認しようとしましたが、返されたファイルを見ると同じエラーメッセージが表示されました。
PHPをstraceし、errnoの結果がshm_open()ライブラリ呼び出しに何であるかを確認します。脇に:この質問から 'lighttpd'タグを削除してください。共有メモリセグメントを作成したユーザーと同じユーザーとしてコードをテストし、lighttpd経由でPHPを実行している可能性がある別のユーザーのアクセス許可エラーかどうかを確認します。その場合は、C + +でfchmod()を使用して、共有メモリセグメントを作成した後にその共有メモリセグメントにアクセス権を設定してみてください。 – gstrauss
'fchmod()'のドキュメントを見ても、 '% 'を入力したときと同じですが、 chmod 777 ... '上から。私はPHPの 'fopen()'、 'fread()'、 'fclose()'をアクセスエラーなしで使うこともできます。私はPHPでさらに警告する方法を徹底的に追究する方法はわかりません。'私は上記に投稿しました。 Lighttpdをrootで実行しようとしましたが、Lighttpdのコードを再コンパイルする必要があります。 – user2205930
http://php.net/manual/en/function.ftok.phpを開き、ftok()の戻り値(整数)を確認します。 C++で作成した共有メモリセグメントと一致しますか? TrはPHPのftok()で 'c'の代わりに ''を使用します。 – gstrauss