2011-08-25 15 views
5

Kod php powinien odczytać pamięć współdzieloną, którą utworzę w programie C poniżej. Jednak czytam wszystkie 0, bez względu na to, do czego ustawiam wartości we wspólnej pamięci. Kod PHPPamięć współdzielona php czyta wszystkie 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); 
    ?> 

kod C tworzy się wspólny blok pamięci rozmiar 8 bajtów.

Mam ten kod, aby utworzyć blok pamięci współużytkowanej. Przekazuję klucz 9875, którego używam w kodzie php. C Kod:

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; 
} 

Sprawdziłem, że program C jest tworzenie współdzielonego obszaru pamięci za pomocą polecenia ipcs i jest tam z prawidłową wartość klucza i wartości shmid który pobiera zwrócony z shmget. Również inicjuję dane dla wszystkich 0xFF.

Program php pomyślnie otwiera obszar pamięci współużytkowanej, a shmid jest zawsze drukowane jako 2, co nie jest zgodne z shmidem generowanym przez shmget (czy to ma znaczenie, czy też php mapuje to na poprawne shmid?).

Dane w $ shm_data są drukowane jako wszystkie 0, podczas gdy powinno być 0xFF !!

Jakieś wskazówki, jak to działa?

+0

Nie widzę żadnych operacji shm_write w dowolnym miejscu ... gdzie w rzeczywistości zapełniasz segment pamięci wspólnej? –

+0

@ Edytowany post @Marc B, aby pokazać inicjalizację danych (buf1) w programie C. Inicjuję bufor dla wszystkich 0xFF. W C nie ma funkcji "zapis do pamięci współdzielonej". Odbywa się to za pomocą wskaźnika do pamięci współdzielonej. – user623879

+0

Wyobraźmy sobie tyle, ale ponieważ tego nie pokazałeś, był to jeden z możliwych powodów, dla których otrzymujesz wszystkie 0. Co to jest "var_dump ($ shm_data)" w PHP po zrobieniu shm_read? –

Odpowiedz

0

Daję uznanie Markowi B i Joshua za odpowiedź na moje pytanie.

Głównym problemem było to, że 0xFF nie było prawidłową wartością, a także nie porównywałem wartości z poprawnym operatorem.

Powiązane problemy