PHPコードは、以下のCプログラムで作成した共有メモリを読み込むことになっています。しかし、私は共有メモリの値を何に設定しても、すべての0を読み込んでいます。 PHPコード:PHP共有メモリはすべて0を読み込みます
<?php
$shm_id = shmop_open(9875, "a", 0, 0);
echo "shmid=".$shm_id." ";
echo "size=".shmop_size($shm_id). " ";
$shm_data = shmop_read($shm_id, 0, 8);
if($shm_data == FALSE)
echo "failed to read";
else
{
echo "data=";
for($i=0;$i < 8;$i++)
{
echo $shm_data[$i];
if($shm_data[$i] == 1)
echo "1";
else if($shm_data[$i] == 0)
echo "0";
else echo "v";
}
}
shmop_close($shm_id);
?>
Cコードは、サイズ8バイトの共有メモリブロックを作成します。
私は共有メモリブロックを作成するためにこのコードを持っています。私はPHPコードで使用する9875のキーを渡します。 Cコード:
buf1 = allocArray_shared(8, sizeof(unsigned char), &shmid, 9875);
for(i = 0; i < 8; i++)
{
buf1[i] = 0xFF;
}
void* allocArray_shared(int elementCount, int elementByteSize, int* shmid, key_t key)
{
//size of entire array(cols*rows* byte size + row pointers)
int array_size = elementByteSize * elementCount;
//Allocate enough space for all elements + row pointers
*shmid = shmget(key, array_size, 00666 | IPC_CREAT);
char * arr = (char*)shmat(*shmid, NULL, 0);
if(!arr) return NULL;
//Return the pointer to the first row pointer
return (void*)arr;
}
私はCプログラムは、IPCSコマンドを使用して、共有メモリ領域を作成しているし、それが正しいキー値とたshmgetから返されるshmidを値であることを確認しました。私はまたすべての0xFFにデータを初期化します。
phpプログラムが正常に共有メモリ領域を開き、shmidは常にshmgetによって生成されたshmidと一致しない2として出力されます(これは問題なのですか?phpは正しいshmidにマップしますか?)。
$ shm_dataのデータはすべて0として出力されますが、0xFFでなければなりません!!
これを稼ぐためのヒントを教えてください。
どこでもshm_write操作が表示されません...実際に共有メモリセグメントにはどこにデータが格納されていますか? –
@Marc B編集済みのポストで、Cプログラムのデータの初期化(buf1)を示しています。バッファをすべて0xFFに初期化します。 Cには「共有メモリへの書き込み」機能はありません。これは共有メモリへのポインタを介して行われます。 – user623879
しかし、あなたがそれを見せなかったので、あなたはすべて0を得ていた可能性がありました。 shm_readを実行した後、PHPで 'var_dump($ shm_data)'ショーは何をしますか? –