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 !!
有关使其正常工作的任何提示吗?
答案 0 :(得分:0)
我赞扬Marc B和Joshua回答我的问题。
主要问题是0xFF不是有效值,而且我没有将值与正确的运算符进行比较。