2011-08-31 19 views
0

我正在使用共享内存将数据(名称,ph编号&地址)发送到另一个进程。我必须在第二个过程中打印数据并将它们存储到文件中。我试过这段代码,但我没有在第二个过程中接收数据。有人可以帮我弄这个吗。 谢谢。使用共享内存将数据结构传递到另一个进程并保存到文件

address.c 

     typedef struct 
{ 
    char lname[25]; 
    char fname[20]; 
    char address[20]; 
    char phonenumber[20]; 
}addressbook; 

addressbook a; 

char *shared_memory; 
int main() 
{ 
    int select; 
    int segment_id; 
    char* shared_memory; 
    int segment_size; 
    key_t shm_key; 
    const int shared_segment_size = 0x6500; 
    shm_key = ftok("/home/madan/programs/shm_tok",'C'); 
    if(shm_key < 0) { 
    printf("failed to create the key %s\n",strerror(errno)); 
    } 
    /* Allocate a shared memory segment. */ 
    segment_id = shmget (shm_key, shared_segment_size, 
      IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); 
    if(segment_id < 0) { 
     printf("error geting the segment id %s\n",strerror(errno)); 
    } 
    printf("segment ID:%d\n", segment_id); 
    /* Attach the shared memory segment. */ 
    shared_memory = (char*) shmat (segment_id, 0, 0); 
    printf ("shared memory attached at address %p\n", shared_memory); 


    printf("enter lastname:\n"); 
    gets(a.lname); 
    printf("enter firstname:\n"); 
    gets(a.fname); 
    printf("enter address:\n"); 
    gets(a.address); 
    printf("enter phone number:\n"); 
    gets(a.phonenumber); 


    memcpy(shared_memory, &a, sizeof(a)); 

    printf("data:%s\n", shared_memory); 

    system("./address-insert"); 
     /* Detach the shared memory segment. */ 
    shmdt (shared_memory); 
/

    * Deallocate the shared memory segment.*/ 
      shmctl (segment_id, IPC_RMID, 0); 
} 

address-insert.c 

typedef struct 
{ 
    char lname[20]; 
    char fname[20]; 
    char address[20]; 
    char phonenumber[20]; 
}addressbook; 
addressbook a; 
int main() 
{ 
    int segment_id; 
    char* shared_memory; 
    FILE *fp; 
    char *name; 
    int segment_size; 
    key_t shm_key; 
    shm_key = ftok("/home/madan/programs/shm_tok",'D'); 
    const int shared_segment_size = 0x6500; 
    /* Allocate a shared memory segment. */ 
    segment_id = shmget (shm_key, shared_segment_size, 
       S_IRUSR | S_IWUSR); 
    if(segment_id < 0) { 
    printf("error:[%s]",strerror(errno)); 
    } 
    printf("segment id %d\n",segment_id); 
    /* Attach the shared memory segment. */ 
    shared_memory = (char*) shmat (segment_id, 0, 0); 
    if(shared_memory == NULL) { 
    printf("failed to attach the shared memory %s",strerror(errno)); 
    } 
    printf ("shared memory2 attached at address %p\n", shared_memory); 

    printf ("name=%s\n", shared_memory); 

    memcpy(&a, shared_memory, sizeof(a)); 
    printf("name: %s\n", a.fname); 
    printf("address:%s\n", a.address); 
    printf("phone number=%s\n", a.phonenumber); 

    fp = fopen("filename","a+"); 
    fwrite(a, 1, strlen(a),fp); 
    fclose(fp); 


    /* Detach the shared memory segment. */ 
    shmdt (shared_memory); 
    return 0; 
} 
+0

会发生什么情况?任何消息打印,....? – pm100

+0

输出:不打印任何东西。 – maddy

+0

看起来像你的第二个程序没有运行。你确定它的名字和位置吗? – pm100

回答

0

你为什么需要两个过程?如果你想这样做,你还需要一个semaphone--这样另一个进程可以确保所有的数据都在共享内存中。也许管道(UNIX或其他)会更简单。

+0

我猜这是一个家庭作业问题,他们必须使用共享内存。 –

+0

我正在做这个问题,特别是要了解共享内存。我需要一些帮助如何使用共享内存传递这些数据。 – maddy

相关问题