2011-08-25 10 views
5

Se supone que el código php lee la memoria compartida que creo en un programa C a continuación. Sin embargo, estoy leyendo todos los 0 sin importar en qué establezca los valores en la memoria compartida. código php:php memoria compartida lee todos 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); 
    ?> 

El código C crea el bloque de memoria compartida de 8 bytes de tamaño.

Tengo este código para crear el bloque de memoria compartida. Paso una clave de 9875, que uso en el código php. C Código:

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

he comprobado que el programa C es la creación de la región de memoria compartida con el comando ipcs y es allí con el valor de la clave correcta y el valor que obtiene shmid regresó de shmget. También inicializo los datos a todos 0xFF.

El programa php abre con éxito la región de memoria compartida, y el shmid siempre se imprime como 2, que no coincide con el shmid generado por shmget (¿esto importa, o php lo asigna al shmid correcto?).

Los datos en $ shm_data se imprimen como todos los 0, mientras que debería ser 0xFF.

¿Algún consejo para que funcione?

+0

No veo ninguna operación shm_write en ninguna parte ... ¿dónde está realmente poblando el segmento de memoria compartida? –

+0

@Marc B publicación editada para mostrar la inicialización de los datos (buf1) en el programa C. Inicializo el buffer a todo 0xFF. No hay función en C para "escribir en la memoria compartida". Esto se hace a través de un puntero a la memoria compartida. – user623879

+0

Imaginé tanto, pero como no lo mostró, era una posible razón por la que estaba obteniendo todos los 0. ¿Qué muestra un 'var_dump ($ shm_data)' en PHP después de hacer el shm_read? –

Respuesta

0

Doy crédito a Marc B y Joshua por responder a mi pregunta.

El problema principal era que 0xFF no era un valor válido y tampoco estaba comparando valores con el operador correcto.

Cuestiones relacionadas