PHP代码应该读取我在下面的C程序中创build的共享内存。 但是,无论我将共享内存中的值设置为什么,我都读取全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代码创build大小为8字节的共享内存块。
我有这个代码来创build共享内存块。 我传入了一个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命令创build共享内存区域,并且使用了正确的键值和从shmget返回的shmid值。 我也将数据初始化为全部0xFF。
PHP程序成功打开共享内存区域,并且shmid始终打印为2,这与shmget生成的shmid不匹配(这是否或者将php映射到正确的shmid?)。
$ shm_data中的数据被打印为全0,而它应该是0xFF!
任何提示让这个工作?
我赞扬马克B和约书亚回答我的问题。
主要的问题是,0xFF不是一个有效的值,我也没有比较值与正确的运算符。