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?
No veo ninguna operación shm_write en ninguna parte ... ¿dónde está realmente poblando el segmento de memoria compartida? –
@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
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? –