5
php代碼應該讀取我在下面的C程序中創建的共享內存。但是,無論我將共享內存中的值設置爲什麼,我都讀取全0。 PHP代碼:php共享內存全部讀取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);
?>
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!
獲取此工作的任何提示?
我在任何地方都看不到任何shm_write操作......你在哪裏填充共享內存段? –
@Marc B編輯後顯示C程序中數據(buf1)的初始化。我將緩衝區初始化爲全部0xFF。 C中沒有功能「寫入共享內存」。這是通過指向共享內存的指針完成的。 – user623879
儘可能多的,但因爲你沒有顯示它,這是你得到全0的一個可能的原因。在執行shm_read之後,'var_dump($ shm_data)'在PHP中顯示什麼? –