php共享内存读取所有0
php代码应该读取我在下面的C程序中创建的共享内存。但是,无论将共享内存中的值设置为什么,我都在读取所有0。 php代码:php共享内存读取所有0,php,c,linux,shared-memory,Php,C,Linux,Shared Memory,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
<?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(无符号字符)和shmid,9875);
对于(i=0;i<8;i++)
{
buf1[i]=0xFF;
}
void*allocArray\u shared(int元素计数、int元素字节大小、int*shmid、key\u t键)
{
//整个数组的大小(列*行*字节大小+行指针)
int array_size=elementByteSize*elementCount;
//为所有元素+行指针分配足够的空间
*shmid=shmget(键,数组大小,00666 | IPC|u创建);
char*arr=(char*)shmat(*shmid,NULL,0);
如果(!arr)返回NULL;
//将指针返回到第一行指针
返回(无效*)arr;
}
我检查了C程序是否正在使用ipcs命令创建共享内存区域,并且该区域具有正确的键值和从shmget返回的shmid值。我还将数据初始化为所有0xFF
php程序成功地打开了共享内存区域,并且shmid始终打印为2,这与shmget生成的shmid不匹配(这有关系吗,或者php是否将其映射到正确的shmid?)
$shm_data中的数据被打印为所有0,而它应该是0xFF
关于如何让这项工作顺利进行,有什么建议吗?我要感谢Marc B和Joshua回答了我的问题
主要问题是0xFF不是有效值,而且我没有将值与正确的运算符进行比较。我在任何地方都没有看到任何shm_写入操作。。。您实际在哪里填充共享内存段?@Marc B编辑了post,以显示C程序中的数据初始化(buf1)。我将缓冲区初始化为所有0xFF。C中没有“写入共享内存”的函数。这是通过指向共享内存的指针来完成的。虽然已经计算了很多,但由于您没有显示它,这可能是您获得所有0的一个原因。在执行shm_读取后,
var_dump($shm_data)
在PHP中显示什么?啊,实际上它正在工作。我将数据更改为88,vardump打印字符串(8)“XXXXXXXX”。我想我不明白字符串在php中是如何表示的。但这仍然回避了一个问题:为什么在这里打印0:else if($shm_data[$i]==0)回显“0”;如何将字符串更改为无符号字节数组?不要忘记PHP类型转换规则。很多东西都测试为0,正因为如此。您需要严格地测试=
,以确保您确实是在与0值进行比较,而不是将某个-other-value-that-php-mangles-into-a-zero进行比较。
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;
}