2017-07-08 57 views
1

私は自分の問題の答えを探しています。ここで設定は、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を実行して、ローカルで実行すると正しいデータを返すかどうかを確認しようとしましたが、返されたファイルを見ると同じエラーメッセージが表示されました。

埋め込みシステムでWebページを閲覧できるようにするために、この共有メモリを読んで、要求が入ったときにグラフをフィードするためのバイナリチャンクをストリームします(その時点でWebソケットには興味がありません)。私は名前付きパイプをPHPとC++で動作させることができますが、このアプリケーション用の共有メモリが必要です。共有メモリへのアクセスは面倒です。どんな助けもありがとうございます。

+1

PHPをstraceし、errnoの結果がshm_open()ライブラリ呼び出しに何であるかを確認します。脇に:この質問から 'lighttpd'タグを削除してください。共有メモリセグメントを作成したユーザーと同じユーザーとしてコードをテストし、lighttpd経由でPHPを実行している可能性がある別のユーザーのアクセス許可エラーかどうかを確認します。その場合は、C + +でfchmod()を使用して、共有メモリセグメントを作成した後にその共有メモリセグメントにアクセス権を設定してみてください。 – gstrauss

+0

'fchmod()'のドキュメントを見ても、 '% 'を入力したときと同じですが、 chmod 777 ... '上から。私はPHPの 'fopen()'、 'fread()'、 'fclose()'をアクセスエラーなしで使うこともできます。私はPHPでさらに警告する方法を徹底的に追究する方法はわかりません。'私は上記に投稿しました。 Lighttpdをrootで実行しようとしましたが、Lighttpdのコードを再コンパイルする必要があります。 – user2205930

+0

http://php.net/manual/en/function.ftok.phpを開き、ftok()の戻り値(整数)を確認します。 C++で作成した共有メモリセグメントと一致しますか? TrはPHPのftok()で 'c'の代わりに ''を使用します。 – gstrauss

答えて

0

私はC共有メモリを使用する必要があるPHP関数を開発しています。あなたのコードとして、私のC関数はshm_open、mmapなどを使用しています。PHPのftok()、shmop_open()を使用してCの共有メモリにアクセスしていますが、このPHP関数は動作しません。
2つの領域には互換性がありません。 PHP(shmop_ *機能付き)を使用するには、「

  • 私はあなたが同期http://php.net/manual/en/book.sync.phpを試してみることをお勧めします:PECL同期拡張が必要です。

  • 関連する問題