2011-08-25 21 views
5

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でなければなりません!!

これを稼ぐためのヒントを教えてください。

+0

どこでもshm_write操作が表示されません...実際に共有メモリセグメントにはどこにデータが格納されていますか? –

+0

@Marc B編集済みのポストで、Cプログラムのデータの初期化(buf1)を示しています。バッファをすべて0xFFに初期化します。 Cには「共有メモリへの書き込み」機能はありません。これは共有メモリへのポインタを介して行われます。 – user623879

+0

しかし、あなたがそれを見せなかったので、あなたはすべて0を得ていた可能性がありました。 shm_readを実行した後、PHPで 'var_dump($ shm_data)'ショーは何をしますか? –

答えて

0

私は私の質問に答えるためにマークBとジョシュアに信用を与えます。

主な問題は、0xFFが有効な値ではなく、値を正しい演算子と比較していないことです。

関連する問題