2011-08-25 5 views
5

पढ़ती है PHP कोड को नीचे दिए गए सी प्रोग्राम में साझा की गई साझा मेमोरी को पढ़ना होता है। हालांकि, मैं सभी 0s पढ़ रहा हूं इससे कोई फर्क नहीं पड़ता कि मैंने साझा स्मृति में मूल्यों को क्या सेट किया है। 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); 
    ?> 

सी कोड आकार 8 बाइट्स की साझा स्मृति ब्लॉक बनाता है।

मेरे पास साझा कोड ब्लॉक बनाने के लिए यह कोड है। मैं 9875 की कुंजी में जाता हूं, जिसे मैं PHP कोड में उपयोग करता हूं। सी कोड:

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; 
} 

मैं जाँच की है कि सी कार्यक्रम IPCS कमांड के साथ साझा स्मृति क्षेत्र पैदा कर रही है और यह सही कुंजी मान और Shmid मूल्य कि shmget से लौटे हो जाता है के साथ नहीं है। मैं डेटा को सभी 0xFF में भी प्रारंभ करता हूं।

PHP प्रोग्राम सफलतापूर्वक साझा मेमोरी क्षेत्र खोलता है, और श्मिट हमेशा 2 के रूप में मुद्रित होता है, जो shmget द्वारा उत्पन्न श्मिट से मेल नहीं खाता है (क्या यह मामला है, या सही श्मिट के लिए PHP मानचित्र करता है?)।

$ shm_data में डेटा सभी 0 के रूप में मुद्रित किया गया है, जबकि यह 0xFF होना चाहिए !!

यह काम करने पर कोई सुझाव?

+0

मुझे कहीं भी कोई shm_write परिचालन नहीं दिख रहा है ... आप वास्तव में साझा मेमोरी सेगमेंट कहां पॉप्युलेट कर रहे हैं? –

+0

@Marc B ने सी प्रोग्राम में डेटा (buf1) के प्रारंभिकरण को दिखाने के लिए पोस्ट संपादित किया। मैं बफर को सभी 0xFF में प्रारंभ करता हूं। सी में "साझा स्मृति को लिखने" में कोई फंक्शन नहीं है। यह साझा स्मृति के लिए सूचक के माध्यम से किया जाता है। – user623879

+0

उतना ही समझा, लेकिन चूंकि आपने इसे नहीं दिखाया, इसलिए यह एक संभावित कारण था कि आप सभी 0 प्राप्त कर रहे थे। Shm_read करने के बाद PHP में 'var_dump ($ shm_data) 'दिखाता है? –

उत्तर

0

मैं अपने प्रश्न का उत्तर देने के लिए मार्क बी और यहोशू को श्रेय देता हूं।

मुख्य मुद्दा यह था कि 0xFF मान्य मान नहीं था और मैं सही ऑपरेटर के साथ मूल्यों की तुलना नहीं कर रहा था।