2013-09-29 98 views
0

我正在閱讀本教科書的POSIX共享內存部分。直到我做了一些更改之後,我才能從書中獲取代碼進行編譯。我理解共享內存和如何打開它的想法,但我仍然對讀/寫有困惑。教科書代碼顯示了一個hello世界字符串的例子,但我不知道如何將它應用到ints,數組,結構等。下面是我正在使用的教科書代碼。這是寫。POSIX共享內存寫入/讀取

const int SIZE = 4096; 
const char *name = "OS"; 
const char *message_0 = "Hello"; 
const char *message_1 = "World!"; 

int shm_fd; 
void *ptr; 

shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); 
ftruncate(shm_fd, SIZE); 
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); 

//sprintf(ptr, "%s", message_0); //non working text book code 
sprintf((char*)ptr, "%s", message_0); //my change to get it to work 
ptr += strlen(message_0); 
//sprintf(ptr, "%s", message_1); 
sprintf((char*)ptr, "%s", message_1); 
ptr += strlen(message_1); 

這裏是閱讀。

const int SIZE = 4096; 
    const char *name = "OS"; 
    int shm_fd; 
    void *ptr; 

    shm_fd = shm_open(name, O_RDONLY, 0666); 
    ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); 

    printf("%s", (char*)ptr); 
    shm_unlink(name); 

我試圖改變這個寫/讀整數,但我無法得到它的工作。我的印象是,我應該能夠做一些整數如:

*ptr = 2; 
ptr++; 

但是,我不明白,或者我嘗試工作的任何其他方式。任何人都可以解釋得更好嗎謝謝。

回答

1

您可以將mmap結果轉換爲int *或double *或任何您喜歡的。你可以做的一件事是將一個結構覆蓋到共享內存上:

struct MyStruct 
{ 
    int s_int; 
    char s_str[64]; 
}; 

void* mem = mmap ... 
struct MyStruct* sp = (struct MyStruct*)mem; 

/* writing */ 
sp->s_int = 3; 
strcpy(sp->s_str, "Hello"); 

/* reading */ 
printf("s_int=%d, s_str=%s\n", sp->s_int, sp->s_str); 
+0

感謝您爲我解決這個問題。這正是我需要的。 – Lucas