2011-08-25 61 views
5

php代码应该读取我在下面的C程序中创建的共享内存。但是,无论我将共享内存中的值设置为什么,我都读取全0。 PHP代码:php共享内存全部读取0s

<?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个字节的共享存储器块。

我有这段代码来创建共享内存块。我传入一个9875的密钥,我在php代码中使用。 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始终打印为2,这与shmget生成的shmid不匹配(这是否存在问题,或者将php映射到正确的shmid?)。

$ shm_data中的数据被打印为全0,而它应该是0xFF!

获取此工作的任何提示?

+0

我在任何地方都看不到任何shm_write操作......你在哪里填充共享内存段? –

+0

@Marc B编辑后显示C程序中数据(buf1)的初始化。我将缓冲区初始化为全部0xFF。 C中没有功能“写入共享内存”。这是通过指向共享内存的指针完成的。 – user623879

+0

尽可能多的,但因为你没有显示它,这是你得到全0的一个可能的原因。在执行shm_read之后,'var_dump($ shm_data)'在PHP中显示什么? –

回答

0

我赞扬Marc B和Joshua回答我的问题。

主要问题是,0xFF不是一个有效的值,我也没有比较值与正确的运算符。