php разделяет память, читает все 0 - PullRequest
5 голосов
/ 25 августа 2011

Код php предназначен для чтения общей памяти, которую я создаю в программе на C ниже.Тем не менее, я читаю все 0, независимо от того, что я установил значения в общей памяти.php code:

<?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, и она там с правильным значением ключа и значением shmid, которое возвращается из shmget.Я также инициализирую данные для всех 0xFF.

Программа php успешно открывает область разделяемой памяти, и shmid всегда печатается как 2, что не соответствует shmid, сгенерированному shmget (имеет ли это значение иликарта php, что к правильному shmid?).

Данные в $ shm_data печатаются как все 0, в то время как они должны быть 0xFF !!

Есть ли какие-нибудь советы по работе?

1 Ответ

0 голосов
/ 03 сентября 2011

Я благодарен Марку Б и Иисусу за то, что они ответили на мой вопрос.

Основная проблема заключалась в том, что 0xFF не было допустимым значением, а также я не сравнивал значения с правильным оператором.

...