2013-04-30 85 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