2013-04-30 81 views
1

以下代碼transfering數據(NSData的)共享內存演示了共享存儲器中的兩個過程(服務器&客戶機)2名的程序之間 此代碼轉移字符之間,但我想此代碼 如何內的兩個程序之間傳遞的NSData我可以這樣做嗎?用於在目標C

 shm_server.c 

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 

#define SHMSZ  27 

int main() 
{ 
    char c; 
    int shmid; 
    key_t key; 
    char *shm, *s; 

    /* 
    * We'll name our shared memory segment 
    * "5678". 
    */ 
    key = 5678; 

    /* 
    * Create the segment. 
    */ 
    if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) { 
     perror("shmget"); 
     exit(1); 
    } 

    /* 
    * Now we attach the segment to our data space. 
    */ 
    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) { 
     perror("shmat"); 
     exit(1); 
    } 

    /* 
    * Now put some things into the memory for the 
    * other process to read. 
    */ 
    s = shm; 

    for (c = 'a'; c <= 'z'; c++) 
     *s++ = c; 
    *s = NULL; 

    /* 
    * Finally, we wait until the other process 
    * changes the first character of our memory 
    * to '*', indicating that it has read what 
    * we put there. 
    */ 
    while (*shm != '*') 
     sleep(1); 

    exit(0); 
} 

shm_client.c 

/* 
* shm-client - client program to demonstrate shared memory. 
*/ 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 

#define SHMSZ  27 

int main() 
{ 
    int shmid; 
    key_t key; 
    char *shm, *s; 

    /* 
    * We need to get the segment named 
    * "5678", created by the server. 
    */ 
    key = 5678; 

    /* 
    * Locate the segment. 
    */ 
    if ((shmid = shmget(key, SHMSZ, 0666)) < 0) { 
     perror("shmget"); 
     exit(1); 
    } 

    /* 
    * Now we attach the segment to our data space. 
    */ 
    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) { 
     perror("shmat"); 
     exit(1); 
    } 

    /* 
    * Now read what the server put in the memory. 
    */ 
    for (s = shm; *s != NULL; s++) 
     putchar(*s); 
    putchar('\n'); 

    /* 
    * Finally, change the first character of the 
    * segment to '*', indicating we have read 
    * the segment. 
    */ 
    *shm = '*'; 

    exit(0); 
} 

在此先感謝

回答

0

您需要序列化數據,將其放入共享內存,然後反序列化,就像通過網絡發送數據一樣。 This example在串行到文本格式時效率有點低,但它應該工作得很好。

+0

http://stackoverflow.com/a/16294825/193892雖然使用分佈式對象可能會更好。 – 2013-04-30 08:06:59