Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php共享内存读取所有0_Php_C_Linux_Shared Memory - Fatal编程技术网

php共享内存读取所有0

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代码应该读取我在下面的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(无符号字符)和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;
}