php共享内存读取全0

时间:2011-08-25 19:08:39

标签: php c linux shared-memory

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

<?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 !!

有关使其正常工作的任何提示吗?

1 个答案:

答案 0 :(得分:0)

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

主要问题是0xFF不是有效值,而且我没有将值与正确的运算符进行比较。