Mã php được cho là đọc bộ nhớ dùng chung mà tôi tạo trong chương trình C bên dưới. Tuy nhiên, tôi đọc tất cả 0 bất kể tôi đặt giá trị trong bộ nhớ chia sẻ thành gì. mã php:Bộ nhớ chia sẻ php đọc tất cả 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);
?>
Mã C tạo khối bộ nhớ chia sẻ có kích thước 8 byte.
Tôi có mã này để tạo khối bộ nhớ dùng chung. Tôi vượt qua trong một khóa 9875, mà tôi sử dụng trong mã php. C Code:
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;
}
Tôi đã kiểm tra rằng chương trình C được tạo vùng bộ nhớ chia sẻ với lệnh TVV và nó là ở đó với giá trị khóa đúng và giá trị shmid đó được trở về từ shmget. Tôi cũng khởi tạo dữ liệu cho tất cả 0xFF.
Chương trình php mở thành công vùng bộ nhớ dùng chung và lệnh shmid luôn được in dưới dạng 2, không khớp với shmid được tạo bởi shmget (có phải vấn đề này hay bản đồ php cho đúng shmid không?).
Dữ liệu trong $ shm_data được in dưới dạng tất cả 0, trong khi nó phải là 0xFF !!
Bất kỳ mẹo nào để làm việc này?
Tôi không thấy bất kỳ hoạt động shm_write nào ở bất cứ đâu ... bạn đang thực sự phổ biến phân đoạn bộ nhớ chia sẻ ở đâu? –
@Marc B đã chỉnh sửa bài đăng để hiển thị dữ liệu khởi tạo (buf1) trong chương trình C. Tôi khởi tạo bộ đệm cho tất cả 0xFF. Không có hàm trong C để "ghi vào bộ nhớ dùng chung". Điều này được thực hiện thông qua con trỏ tới bộ nhớ dùng chung. – user623879
Có vẻ như nhiều, nhưng vì bạn không thể hiện nó, đó là một lý do có thể khiến bạn nhận được tất cả 0. Một 'var_dump ($ shm_data)' hiển thị trong PHP sau khi bạn làm shm_read là gì? –